Problem
Invert a binary tree.
Example
4
/ \
2 7
/ \ / \
1 3 6 9
->
4
/ \
7 2
/ \ / \
9 6 3 1
Algorithm
整理一下題意:翻轉一棵二叉樹。
首先想到的當然是遞歸解法。對每個節點,都翻轉左右子樹。
代碼如下。
//遞歸版本,用時0ms
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==NULL) return NULL;
TreeNode* temp=root->left;
root->left=invertTree(root->right);
root->right=invertTree(temp);
return root;
}
};
然而,
題目中寫了這麼一句
This problem was inspired by this original tweet by Max Howell:
Google: 90% of our engineers use the software you wrote (Homebrew), but you can’t invert a binary tree on a whiteboard so fuck off.
那麼這題真有這麼簡單?剛剛的遞歸解法AC了,那麼嘗試一下非遞歸解法吧。
要翻轉整棵樹,那麼對每個左子和右子都要翻轉。由於左子和右子交換時,左子和右子的子樹也隨之交換,所以只要對左子右子做處理即可。交換的左子和右子必然是在同一層的,那麼可以考慮通過層次遍歷來實現。
在層次遍歷的過程中,對每個左子和右子都進行交換。對子樹爲NULL的情況稍作處理即可。
代碼如下。
//非遞歸版本,用時3ms
class Solution {
public:
TreeNode* invertTree(TreeNode* root) {
if(root==NULL) return NULL;
queue<TreeNode*> q;
TreeNode* p;
TreeNode* temp;
q.push(root);
while(!q.empty()){
p=q.front();
q.pop();
temp=p->left;
p->left=p->right;
p->right=temp;
if(p->left!=NULL) q.push(p->left);
if(p->right!=NULL) q.push(p->right);
}
return root;
}
};
提交代碼,AC。沒想到用時反而比遞歸版本還長。所以Max Howell那句話真是在開玩笑嘛…