我的力扣算法144-二叉树的前序遍历

我来了,虽然说没啥人看,有点小失落,但是莫问题,就当监督自己学习了!来康康今天的力扣每日一题:
在这里插入图片描述
这道题,我个人认为考察两点,第一,什么是前序遍历,这个需要好好考虑,这对最后的输出结果有着必然的联系,然后就是实现这个题的算法,解法很多种,有递归和迭代等等,这里我就借花献佛,用评论区大佬的迭代来讲一讲这道题:
首先迭代的定义,就是我这次的结果是我下次迭代的开始,就比如说,我现在运行到一个节点了,我下一次运行时就是从这个节点的左节点或者右节点开始运行,这就是迭代的一种方式,像这种关于树的题目,很多都和迭代有关系。

在这里插入图片描述

说完了迭代,就开始讲核心算法,前序遍历,就是根左右,访问了现在这个节点就访问这个节点的左节点,访问完了,或者没有左节点,就访问右节点,同理,如果访问完了右节点或者没有右节点就退到上一个节点的右节点,如此反复。上图的先序遍历就是ABDECF
接下来是代码:

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ans;//定义一个动态数组存放先序遍历
        stack<TreeNode*> s;//定义一个栈,利用栈的先进后出的原理,进行遍历树
        s.push(root);
        while(!s.empty()){
            TreeNode* r=s.top();//取得当前栈的栈顶元素
            s.pop();//释放栈顶元素
            if(!r)continue;//如果为null就不执行后面的步骤
            ans.push_back(r->val);//存放当前节点的值
            s.push(r->right);//将右节点放入栈中
            s.push(r->left);//将左节点放入栈中
        }
        return ans;
    }
};

如果只是看代码的话,也许会觉得不对劲,下面看下图:
在这里插入图片描述
在这里插入图片描述
如此反复就可以求得当前树的前序遍历。
加了个油!

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页