二叉樹---遍歷
一般用遞迴和堆疊來遍歷
- 前序遍歷:列印 - 左 - 右
- 中序遍歷:左 - 列印 - 右
- 後序遍歷:左 - 右 - 列印
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) 的級別。
相關文章
- 二叉樹遍歷二叉樹
- 二叉樹遍歷方法二叉樹
- 二叉樹的遍歷二叉樹
- 二叉樹遍歷 -- JAVA二叉樹Java
- C++樹——遍歷二叉樹C++二叉樹
- 144.二叉樹的前序遍歷145.二叉樹的後序遍歷 94.二叉樹的中序遍歷二叉樹
- 【LeetCode-二叉樹】二叉樹前序遍歷LeetCode二叉樹
- 迴圈遍歷二叉樹二叉樹
- 二叉樹四種遍歷二叉樹
- 完全二叉樹的遍歷二叉樹
- 6.14-二叉樹遍歷二叉樹
- 二叉樹--後序遍歷二叉樹
- 玩轉二叉樹(樹的遍歷)二叉樹
- 根據二叉樹的前序遍歷和中序遍歷輸出二叉樹;二叉樹
- 二叉樹的遍歷筆記二叉樹筆記
- 二叉樹的遍歷實現二叉樹
- 二叉樹的層序遍歷二叉樹
- 二叉樹的按層遍歷二叉樹
- 二叉樹遍歷方法總結二叉樹
- 二叉樹的遍歷 → 不用遞迴,還能遍歷嗎二叉樹遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 根據前序遍歷序列、中序遍歷序列,重建二叉樹二叉樹
- 從上到下遍歷二叉樹-Java二叉樹Java
- 二叉樹的遍歷 (迭代法)二叉樹
- 資料結構 二叉樹遍歷資料結構二叉樹
- 二叉樹的遍歷及應用二叉樹
- 144. 二叉樹的前序遍歷二叉樹
- 二叉樹:構造二叉樹(通過前序和中序遍歷)、映象翻轉、層次遍歷二叉樹
- 二叉樹排序樹的建立,遍歷和刪除二叉樹排序
- 二叉樹的深度、寬度遍歷及平衡樹二叉樹
- 樹3-二叉樹非遞迴遍歷(棧)二叉樹遞迴
- 資料結構——樹與二叉樹的遍歷資料結構二叉樹
- WeetCode4 —— 二叉樹遍歷與樹型DP二叉樹
- 面試中很值得聊的二叉樹遍歷方法——Morris遍歷面試二叉樹
- Leetcode——144. 二叉樹的前序遍歷LeetCode二叉樹
- [LintCode]BinaryTreeLevelOrderTraversal(二叉樹的層次遍歷)二叉樹
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 非遞迴先序遍歷二叉樹遞迴二叉樹