二叉樹的前序、中序、後序遍歷(遞歸)和 層序遍歷(C++實現)

1. 二叉樹的前序遍歷

  • 根 左 右
  • 因爲先訪問根節點,所以直接將rootval放入答案(ans)容器內。
  • 然後遍歷左子樹,現在以root的左子樹爲root進入遞歸。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */

class Solution {
public:
    vector<int> ans;
    vector<int> preorderTraversal(TreeNode* root) {
        if(root != NULL){
            ans.push_back(root -> val);
            preorderTraversal(root -> left);
            preorderTraversal(root -> right);
        }
        return ans;
    }
};

2. 二叉樹的中序遍歷

  • 左 根 右
  • 與前序遍歷相似,只需要調換順序。
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> ans;
    vector<int> inorderTraversal(TreeNode* root) {
        if(root!=NULL){
            inorderTraversal(root->left);
            ans.push_back(root->val);
            inorderTraversal(root->right);
        }
        return ans;
    }
};

3. 二叉樹的後序遍歷

  • 左 右 根
class Solution {
public:
    vector<int> ans;
    vector<int> postorderTraversal(TreeNode* root) {
        if(root!=NULL){
            postorderTraversal(root->left);
            postorderTraversal(root->right);
            ans.push_back(root->val);
        }
        return ans;
    }
};

4. 二叉樹的層序遍歷 - 廣度優先搜索(BFS 隊列)

給定一個二叉樹,返回其按層序遍歷得到的節點值。 層序遍歷即逐層地、從左到右訪問所有結點。

示例:
二叉樹:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其層次遍歷結果:

[
  [3],
  [9,20],
  [15,7]
]
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector <vector <int>> ret;   //定義輸出的二維數組
        if (!root) return ret;  //如果沒有節點,輸出空的二維數組

        queue <TreeNode*> q;   //定義結構體隊列q
        q.push(root);  //將根節點加入進去
        while (!q.empty()) {  //當隊列不爲空時,即表示二叉樹還存在左右子樹
            int currentLevelSize = q.size();  //當前隊列q內的元素個數
            ret.push_back(vector <int> ());  //輸出ret加入一個新的空vector
            for (int i = 1; i <= currentLevelSize; i++) {
                auto node = q.front(); q.pop();  //node取爲q的第一個元素,再去掉這個元素
                ret.back().push_back(node->val);  //給ret的最後一個元素即空vector加入q的第一個元素
                if (node->left) q.push(node->left);  //如果存在左節點,給隊列q加入該節點
                if (node->right) q.push(node->right);
            }
        }
        
        return ret;
    }
};

/*返回其自底向上的層次遍歷爲:
[
  [15,7],
  [9,20],
  [3]
]
*/
//只需要反序輸出二維數組即可(有以下兩種方法)
reverse(ret.begin(),ret.end());
return vector <vector <int>>(ret.rbegin(),ret.rend());

複雜度分析

記樹上所有節點的個數爲 n。

時間複雜度:每個點進隊出隊各一次,故漸進時間複雜度爲 O(n)。
空間複雜度:隊列中元素的個數不超過 n 個,故漸進空間複雜度爲 O(n)。

鏈接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/er-cha-shu-de-ceng-xu-bian-li-by-leetcode-solution/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章