力扣刷题记录36.1-----144. 二叉树的前序遍历(迭代实现)


一、题目

在这里插入图片描述

在这里插入图片描述

二、代码

/**
 * 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:
    //第一:参数和返回值
    //第二:终止条件
    //第三:每一层的逻辑
    void tree_for_each_recursive(TreeNode* cur,vector<int>& result)   //二叉树的递归遍历  其实是用的是栈
    {
        if(cur==nullptr) return;
        //中序和后序遍历只需要微调顺序即可
        result.push_back(cur->val);
        tree_for_each_recursive(cur->left,result);
        tree_for_each_recursive(cur->right,result);

    };

    vector<int> preorderTraversal(TreeNode* root) 
    {
      vector<int> return_vector;

      ///递归
      //tree_for_each_iteration(root,return_vector);
 
      //迭代
      stack<TreeNode*> my_stack_for_iteration;

      if(root==nullptr) return return_vector;
      else my_stack_for_iteration.push(root);  //先将根节点压入堆栈
      //思路:弹出处理节点 压入新节点 直到栈中无节点为止
     while(!my_stack_for_iteration.empty())
     {
        TreeNode* node=my_stack_for_iteration.top();  //有必要记录一下这个节点 不然弹出之后就找不到左右节点了
        return_vector.push_back(node->val);  //取出栈顶的元素   核心:下一次pop出来的是要处理的节点
        my_stack_for_iteration.pop();
        if(node->right) my_stack_for_iteration.push(node->right);
        if(node->left) my_stack_for_iteration.push(node->left);
     }
      return return_vector;
    }
};

三、运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值