[資料結構][Leetcode]翻轉二叉樹
阿新 • • 發佈:2019-02-15
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)。因此翻轉一個二叉樹,就是把根節點的左子樹翻轉一下,同樣的把右子樹翻轉一下,在交換左右子樹就可以了。
當然,翻轉左子樹和右子樹的過程和當前翻轉二叉樹的過程沒有區別,就是遞迴的呼叫當前的函式就可以了。
因此,翻轉二叉樹的步驟可總結如下:
- 翻轉根節點的左子樹(遞迴呼叫當前函式)
- 翻轉根節點的右子樹(遞迴呼叫當前函式)
- 交換根節點的左子節點與右子節點
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; } };