[Leetcode 題解 / 226] Invert Binary Tree

Homebrew是OS X平臺上的包管理工具,在用Mac的程序員基本都知道這個工具。
HomeBrew的開發者是Max Howell。然而面試谷歌時卻蛋疼了。Max Howell在Twitter發帖:


twitter

可見,會手寫反轉二叉樹多么重要。正好Leetcode上有這個題目,下面進入正題。

二叉樹是數據結構里一個重要的概念。
而反轉二叉樹的基本意思就是下圖這樣。
Invert a binary tree.

     4
   /   \
  2     7
 / \   / \
1   3 6   9

to:

     4
   /   \
  7     2
 / \   / \
9   6 3   1

每一個節點的左右子樹對換,左右子樹的左右節點也需要交換,這種時候很容易想到的就是遞歸的方法。
下面是在Leetcode 通過的C++代碼:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        TreeNode* tmp;
        if(!root)
            return NULL;
        if(root->left)
            root->left=invertTree(root->left);
        if(root->right)
            root->right=invertTree(root->right);
        tmp=root->left;
        root->left=root->right;
        root->right=tmp;
        return root;     
    }
};

至于非遞歸的做法也很簡單,借助一個隊列就可以實現,在C++里,直接使用標準庫的queue就可以。
首先取根節點入隊,再出隊,交換它的左右節點,再將左右節點入隊,這樣就可以以層次遍歷的方法,處理每一層的節點。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        queue<TreeNode *> node_queue;
        
        if(root == NULL)
            return root;
        node_queue.push(root);
        while(node_queue.size()>0) 
        {
            TreeNode* pFrontNode = node_queue.front();
            node_queue.pop();
            TreeNode *tmp = pFrontNode->left;
            pFrontNode->left = pFrontNode->right;
            pFrontNode->right = tmp;
            if(pFrontNode->left)
                node_queue.push(pFrontNode->left);
            if(pFrontNode->right)
                node_queue.push(pFrontNode->right);
        }
        return root;
        
    }
};

最近在看Python,用Python實現也一樣,遞歸解法:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        if root is None:
            return None
        root.left,root.right = self.invertTree(root.right),self.invertTree(root.left)
        return root
        

非遞歸

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def invertTree(self, root):
        """
        :type root: TreeNode
        :rtype: TreeNode
        """
        queue = collections.deque()
        if root:
            queue.append(root)
        while queue:
            node = queue.popleft()
            if node.left:
                queue.append(node.left)
            if node.right:
                queue.append(node.right)
            node.left,node.right = node.right,node.left
        return root
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • LeetCode 刷題隨手記 - 第一部分 前 256 題(非會員),僅算法題,的吐槽 https://leetc...
    蕾娜漢默閱讀 17,922評論 2 36
  • 二叉樹的定義#### 二叉樹是n(n>=0)個具有相同類型的元素的有限集合,當n=0時稱為空二叉樹,當n>0時,數...
    kylinxiang閱讀 1,449評論 0 2
  • 1 序 2016年6月25日夜,帝都,天下著大雨,拖著行李箱和同學在校門口照了最后一張合照,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,165評論 0 12
  • 總結 想清楚再編碼 分析方法:舉例子、畫圖 第1節:畫圖分析方法 對于二叉樹、二維數組、鏈表等問題,都可以采用畫圖...
    M_巴拉巴拉閱讀 1,230評論 0 7
  • 去年二叉樹算法的事情鬧的沸沸揚揚,起因是Homebrew 的作者 @Max Howell 在 twitter 上發...
    Masazumi柒閱讀 1,627評論 0 8