LeetCode #226 - Invert Binary Tree - Easy

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那句話真是在開玩笑嘛…

發佈了63 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章