做出這道題,說明你很有機會進入 Google

做出這道題,說明你很有機會進入 Google

題目描述

翻轉一棵二叉樹。

示例:

輸入:

 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,但是你居然不能在白板上寫出翻轉二叉樹的代碼,所以滾蛋吧。

做出這道題,說明你很有機會進入 Google

Max Howell

所以,如果你能做出這道題,說明你很有機會進入 Google 。

本文完。


今日問題:

嘗試一下在留言區,用自己熟悉的編程語言白板寫出翻轉二叉樹的代碼。

打卡格式:

打卡 X 天,答:xxx 。

喜歡就點擊“好看”吧!


分享到:


相關文章: