二叉樹---遍歷

樹莓派派酒發表於2020-12-01

一般用遞迴和堆疊來遍歷

  • 前序遍歷:列印 - 左 - 右
  • 中序遍歷:左 - 列印 - 右
  • 後序遍歷:左 - 右 - 列印

1. 遞迴遍歷

遞迴函式實現,

定義 inorder(root) 表示當前遍歷到 root 節點的答案,那麼按照定義,我們只要遞迴呼叫 inorder(root.left) 來遍歷 \textit{root}root 節點的左子樹,然後將 root 節點的值加入答案,再遞迴呼叫inorder(root.right) 來遍歷root 節點的右子樹即可,遞迴終止的條件為碰到空節點。

終止條件:當前節點為空時
函式內:遞迴的呼叫左節點,列印當前節點,再遞迴呼叫右節點

複雜度分析

時間複雜度:O(n),其中 nn 為二叉樹節點的個數。二叉樹的遍歷中每個節點會被訪問一次且只會被訪問一次。
空間複雜度:O(n)。空間複雜度取決於遞迴的棧深度,而棧深度在二叉樹為一條鏈的情況下會達到 O(n)的級別。

class Solution {
public:
    void inorder(TreeNode* root, vector<int>& res) {
        if (!root) {
            return;
        }
        inorder(root->left, res);
        res.push_back(root->val);
        inorder(root->right, res);
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        inorder(root, res);
        return res;
    }
};

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/er-cha-shu-de-zhong-xu-bian-li-by-leetcode-solutio/

2 迭代法層次遍歷

二叉樹的層次遍歷就是圖論中的廣度優先搜尋在二叉樹中的應用,需要藉助佇列來實現(此時是不是又發現佇列的應用了使用佇列(深度優先搜尋的話,使用棧)。

https://blog.csdn.net/qq_29762941/article/details/80908072

https://mp.weixin.qq.com/s/Gb3BjakIKGNpup2jYtTzog

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> stk;
        while (root != nullptr || !stk.empty()) {
            while (root != nullptr) {
                stk.push(root);
                root = root->left;
            }
            root = stk.top();
            stk.pop();
            res.push_back(root->val);
            root = root->right;
        }
        return res;
    }
};

作者:LeetCode-Solution
連結:https://leetcode-cn.com/problems/binary-tree-inorder-traversal/solution/er-cha-shu-de-zhong-xu-bian-li-by-leetcode-solutio/

複雜度分析

時間複雜度:O(n),其中 nn 為二叉樹節點的個數。二叉樹的遍歷中每個節點會被訪問一次且只會被訪問一次。
空間複雜度:O(n)。空間複雜度取決於棧深度,而棧深度在二叉樹為一條鏈的情況下會達到 O(n)O(n) 的級別。

 

相關文章