1. 程式人生 > 其它 >LeetCode 226.翻轉二叉樹(C++)遞迴

LeetCode 226.翻轉二叉樹(C++)遞迴

技術標籤:LeetCode刷題二叉樹演算法c++資料結構遞迴演算法

在這裡插入圖片描述
在這裡插入圖片描述

遞迴思路與演算法

這是一道很經典的二叉樹問題。顯然,我們從根節點開始,遞迴地對樹進行遍歷,並從葉子結點先開始翻轉。如果當前遍歷到的節點 root 的左右兩棵子樹都已經翻轉,那麼我們只需要交換兩棵子樹的位置,即可完成以 root 為根節點的整棵子樹的翻轉。

class Solution {
public:
    TreeNode* invertTree(TreeNode* root) {
        if (root == nullptr) {
            return nullptr;
        }
//從根節點開始,遞迴地對樹進行遍歷,並從葉子結點先開始翻轉 TreeNode* left = invertTree(root->left); TreeNode* right = invertTree(root->right); //當最底層子節點時,對調該結點的左右子節點 root->left = right; root->right = left; return root; } };

複雜度分析

時間複雜度:O(N),其中 N 為二叉樹節點的數目。我們會遍歷二叉樹中的每一個節點,對每個節點而言,我們在常數時間內交換其兩棵子樹。

空間複雜度:O(N)。使用的空間由遞迴棧的深度決定,它等於當前節點在二叉樹中的高度。在平均情況下,二叉樹的高度與節點個數為對數關係,即 O(logN)。而在最壞情況下,樹形成鏈狀,空間複雜度為 O(N)。