题目的链接在这里:
https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
题目大意
给定一棵二叉树,然后返回他的前序遍历
一、示意图
二、解题思路
1.首先是使用迭代的方法
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
//前序遍历就是根左右,应该是用队列,然后依次进队列,如果遇到左子树没有的,再
//让其右子树进栈,就是弄一个 while循环吧,也就是遇到一个节点就访问他,然后
//一直访问他的左子树(就是秉持了根左右的想法),根弄完之后,就是左,再是右
//先创建一个栈
vector<int> ans;
stack<TreeNode *> s;
while(root||s.size()){
while(root){
s.push(root);//把跟结点进去,并输出对应的值
ans.push_back(root->val);//输入完了之后就要指向左子树,并且
//是在循环里
root=root->left;
}
//循环结束之后,将栈顶的删除,并且指向右边
TreeNode* node=s.top();
s.pop();
//把新的指向这个栈提取出来的右边
root=node->right;
}
return ans;
}
};
2.还有就是使用递归的,依次调用函数即可
代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> ans;
vector<int> preorderTraversal(TreeNode* root) {
//如果不迭代的话,使用递归直接一点点调用,创建一个int类型的数据,然后一点点递
//在他好还存在的情况下,把他放到数组中,然后再一次递归他的左右子树
if(root){
ans.push_back(root->val);//再依次递归左右
preorderTraversal(root->left);
preorderTraversal(root->right);
}
//这里就要返回一下
return ans;
}
};