【每日算法】LeetCode 144 —— 二叉树前序遍历(二百三十四)

题目内容

给你二叉树的根节点 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]

提示

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

题解

前序遍历就是先根遍历,递归的写法很简单这里就不赘述了。

我们看一个不递归的思想,使用栈来做。

首先,判断栈是否为空或者当前节点是否为空,因为是第一次,所以栈为空,根节点不为空,指针遍历根节点,然后将根节点压栈。

然后,指针指向根节点的左子树,一直重复前两步,直到将全部的左子节点压入栈中。

然后,依次弹栈,遍历每个节点的右子树。

最后,因为有while循环做保障,每次都会判断栈是否为空或者当前节点是否为空,因此右子树的左子节点也会继续被遍历。

最终前序遍历就完成了。

具体请看代码。

(这里插个题外话,前序遍历和中序遍历在栈的遍历顺序上是一致的,区别就是根节点遍历的代码位置不一样而已。)

代码

/**
* 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> ans;
vector<int> preorderTraversal(TreeNode* root) {
dfs(root);
return ans;
}
void dfs(TreeNode* root){
if(!root) return;
ans.push_back(root->val);
dfs(root->left);
dfs(root->right);
}
};

//非递归版本
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> ans;
stack<TreeNode*> stk;
while(stk.size()||root){
while(root){
ans.push_back(root->val);
stk.push(root);
root = root->left;
}
root = stk.top()->right;
stk.pop();
}
return ans;
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/09/16/【每日算法】LeetCode-144-——-二叉树前序遍历(二百三十四)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号