【leetcode】二叉树的前序遍历c++

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

示例 1:
在这里插入图片描述

输入:root = [1,null,2,3]
输出:[1,2,3]

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:
在这里插入图片描述

输入:root = [1,2]
输出:[1,2]

示例 5:
在这里插入图片描述

输入:root = [1,null,2]
输出:[1,2]

提示:

树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100

递归法 代码:

/**
 * 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:
    vector<int> v;
    void solve(TreeNode* root) {
    
    
        if(root!=NULL){
    
    
            v.push_back(root->val);  
            cout<<root->val<<endl;
            if(root->left!=NULL)
            preorderTraversal(root->left);
            if(root->right!=NULL)
            preorderTraversal(root->right);
        }
    }
    vector<int> preorderTraversal(TreeNode* root) {
    
    
        if(root==NULL)return v;
        solve(root);
        return v;
    }
};

每一轮递归的处理:把当前节点值加入vector中

递归终止条件:当前处理节点为空

递归范围缩小:先处理左节点,再处理右节点,逐渐向树的叶子节点靠拢

迭代法 代码:

/**
 * 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:
    stack<TreeNode*> s; //
    vector<int> v;
    vector<int> preorderTraversal(TreeNode* root) {
    
    
        if(root==NULL)return v;
        s.push(root);
        while(!s.empty()){
    
     //当栈为空,结束
            TreeNode* node = s.top();  //取当前栈的顶点
            v.push_back(node->val);  //当前节点的值加入v中
            s.pop();  //处理完的节点出栈
            if(node->right!=NULL){
    
      //因为栈先进后出,前序遍历顺序为中左右,中已经处理过了,只剩左右,应颠倒左右的位置,先右后左
                s.push(node->right);
            }
            if(node->left!=NULL){
    
    
                s.push(node->left);
            }

        }
        return v;
    }
};


迭代法就是用变量来递进处理,来模拟调用自身的递归法。

使用栈存储所有待处理节点,栈顶节点为当前正在处理的节点。

每次取栈顶元素,将其值加入vector,因为该节点已经保存了值,把该节点出栈;然后依次把其右节点和左节点压入栈。(栈具有先进后出的特点,所以入栈顺序与前序遍历原顺序相反,先左后右变成先右后左)

若栈为空,说明节点已经处理完,结束,返回结果。

猜你喜欢

转载自blog.csdn.net/qq_40315080/article/details/117534237