1. 程式人生 > >[資料結構][Leetcode]翻轉二叉樹

[資料結構][Leetcode]翻轉二叉樹

1.問題描述

Invert a binary tree.For example:
翻轉前
to
翻轉後

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.

問題來源於Leetcode

2.問題分析

翻轉一個二叉樹,直觀上看,就是把二叉樹的每一層左右順序倒過來。比如問題中的例子,第三層1-3-6-9經過變換後變成了9-6-3-1,順序反過來就對了。
再仔細觀察一下,對於上面的例子,根節點(root)的左子節點及其所有的子孫節點構成根節點的左子樹(left subtree),同樣的,根節點(root)的右子節點及其所有的子孫節點構成根節點的右子樹(right subtree)。因此翻轉一個二叉樹,就是把根節點的左子樹翻轉一下,同樣的把右子樹翻轉一下,在交換左右子樹就可以了。
左子樹和右子樹


當然,翻轉左子樹和右子樹的過程和當前翻轉二叉樹的過程沒有區別,就是遞迴的呼叫當前的函式就可以了。
因此,翻轉二叉樹的步驟可總結如下:

  1. 翻轉根節點的左子樹(遞迴呼叫當前函式)
  2. 翻轉根節點的右子樹(遞迴呼叫當前函式)
  3. 交換根節點的左子節點與右子節點

3.程式程式碼

class Solution{
public:
void exchange(TreeNode* root){
    TreeNode* node=root;
    if(node!=NULL){
        TreeNode* temp=node->left;
        node->left=node->right;
        node->right=temp;
    }
} 
TreeNode* invertTree(TreeNode* root) {
    TreeNode* node=root;
    if(root==NULL) {
        return root;
    }
    invertTree(node->left);//翻轉左子樹
    invertTree(node->right);//翻轉右子樹
    exchange(node);//交換左子節點與右子節點
    return root;
}
};