二叉树的前序、中序、后序遍历(递归)和 层序遍历(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/

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