首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 226 Invert Binary Tree:遞歸交換左右子樹

     編輯:關於C++

題目大意

給定二叉樹根節點,將其左右子樹遞歸交換,返回翻轉後的根節點。

遞歸解法(後序遍歷思想)

  1. 若節點為空,返回空。
  2. 遞歸翻轉左子樹,得到新左子樹。
  3. 遞歸翻轉右子樹,得到新右子樹。
  4. 交換左右子樹指針。
  5. 返回當前節點。

代碼實現

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

優化版(合併基準情況)

原代碼對葉節點單獨判斷,實際上交換兩個空指針無副作用,可簡化:

TreeNode* invertTree(TreeNode* root) {
    if (!root) return nullptr;
    TreeNode* tmp = invertTree(root->left);
    root->left = invertTree(root->right);
    root->right = tmp;
    return root;
}

迭代版(BFS/DFS 顯式棧)

TreeNode* invertTree(TreeNode* root) {
    if (!root) return nullptr;
    stack st; st.push(root);
    while (!st.empty()) {
        TreeNode* cur = st.top(); st.pop();
        swap(cur->left, cur->right);
        if (cur->left) st.push(cur->left);
        if (cur->right) st.push(cur->right);
    }
    return root;
}

複雜度

  • 時間 O(n),每個節點訪問一次。
  • 空間 O(h) 遞歸棧 / 顯式棧,`h` 為樹高。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved