给你二叉树的根节点 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]扫描二维码关注公众号,回复: 13162863 查看本文章![]()
提示:
树中节点数目在范围 [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,因为该节点已经保存了值,把该节点出栈;然后依次把其右节点和左节点压入栈。(栈具有先进后出的特点,所以入栈顺序与前序遍历原顺序相反,先左后右变成先右后左)
若栈为空,说明节点已经处理完,结束,返回结果。