題目描述
翻轉一棵二叉樹。
示例:
輸入:
4
/ \
2 7
/ \ / \
1 3 6 9
輸出:
4
/ \
7 2
/ \ / \
9 6 3 1
解法
這道題確實難度不大,可以用 遞歸 和 非遞歸 兩種方法來解。
先來看遞歸的方法,寫法非常簡潔,只需要五行代碼搞定:交換當前左右節點,然後直接調用遞歸即可 。
// 遞歸解法
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (!root) return NULL;
TreeNode *tmp = root->left;
root->left = invertTree(root->right);
root->right = invertTree(tmp);
return root;
}
};
非遞歸的解法跟二叉樹的層序遍歷一樣,需要用 queue 來輔助。
首先把根節點排入隊列中,然後從隊中取出來,交換其左右節點,如果存在則分別將左右節點在排入隊列中,以此類推直到隊列中沒有節點了再停止循環,最後返回 root 即可。
// 非遞歸解法
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if (!root) return NULL;
queue<treenode> q;
q.push(root);
while (!q.empty()) {
TreeNode *node = q.front(); q.pop();
TreeNode *tmp = node->left;
node->left = node->right;
node->right = tmp;
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
return root;
}
};
/<treenode>
典故
據說 Max Howell( 90% google 的人都用過他寫的 Homebrew )去 Google 面試,然後 Google 要求他用白板翻轉一顆二叉樹,結果寫不出來就被 Google 拒了。
事情大概是說,Max Howell 去 Google 面試,面試官說:雖然在 Google 有 90% 的工程師用你寫的 Homebrew,但是你居然不能在白板上寫出翻轉二叉樹的代碼,所以滾蛋吧。
Max Howell
所以,如果你能做出這道題,說明你很有機會進入 Google 。
本文完。
今日問題:
嘗試一下在留言區,用自己熟悉的編程語言白板寫出翻轉二叉樹的代碼。
打卡格式:
打卡 X 天,答:xxx 。
喜歡就點擊“好看”吧!