1. 程式人生 > >leetcode226題 題解 翻譯 C語言版 Python版

leetcode226題 題解 翻譯 C語言版 Python版

226. Invert Binary Tree

Invert a binary tree.

     4
   /   \
  2     7
 / \   / \
1   3 6   9
to
     4
   /   \
  7     2
 / \   / \
9   6 3   1
Trivia:
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.

226.翻轉二叉樹

把一棵二叉樹翻轉(如圖)

冷知識:

這個問題啟迪於Max Howell的這個推文

谷歌:雖然我們90%的工程師用你寫的軟體(Homebrew),但你卻不能在一卻白板上翻轉一個二叉樹,所以滾蛋吧。

(Homebrew是Mac平臺上的軟體包管理器,作者是Max Howell,但Max Howell被谷歌拒絕聘用,原因是演算法能力不行,所以他發了這條推文。)

思路:從圖上看是要把每棵樹的左右子樹互換,所以可以用遞迴快速解決問題。對於任意一個結點,先將其左子樹呼叫當前函式完成翻轉,再將其右子樹呼叫當前函式完成翻轉。然後交換左右子樹,返回這個結點即可。遞迴的終點是判斷給的結點值是否為空,如果為空說明到達葉結點的子樹了,直接返回空就行了。程式碼中可寫的稍微簡練些,先記錄左子樹,然後讓右子樹完成翻轉後賦給左子樹,左子樹完成翻轉後賦給右子樹。Python中可直接兩個變數一起賦值,無需記錄。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
struct TreeNode* invertTree(struct TreeNode* root) {
    if (root == NULL) return NULL;
    struct TreeNode* left = root->left;
    root->left = invertTree(root->right);
    root->right = invertTree(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
        """
        if root == None: return None
        root.left, root.right = self.invertTree(root.right), self.invertTree(root.left)
        return root