给定一个二叉树,返回它的 前序 遍历。
示例:
输入: [1,null,2,3]
1
2
/
3
输出: [1,2,3]
前序遍历: 根节点 --》左子树 --》右子树
思路:
1
2 3
1 3 5 6
6 7
7 9 0
栈stack:先进后出
堆heap:先进先出
**
stack知识点
**
1、本质:stack是一个容器;实现了栈的先进后出的特点。
2、头文件: #include <stack>
3、定义方式: stack <int> s1;
stack <string> s2;
4、基本操作: (1)入栈 : s.push(x);
(2)出栈 : s.pop();
(3)栈顶 : s.top();
(4)判空 : s.empty();
(5)元素个数:s.size();
**
vector知识点
**
1、本质:在C++中;cector标识一个容器。
2、作用:能够像容器一样存放各种类型的对象;简单来说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据
3、注意事项:
(1)标识的向量长度较长(需要为向量内保存很多数);容易导致内存泄漏,而且效率低
(2)vector作为函数的参数或者返回值;注意他的写法
double Distance(vector<int> &a, vector<int> &b)其中&不可以缺少
4、头文件: #include <vector>
5、创建:
6、用法:
(1)尾部插入 : vec.push_back(a);
(2)下标访问 : vec[0];vec[0][0]
(3)
(4)插入元素 : vec.insert(vec.begin()+i,a);//在第 i+1 个元素之前插入 a
(5)删除元素 : vec.erase(vec.begin()+2);//删除第三个元素
vec.erase(vec.begin()+i,vec.begin()+j);删除区间[i,j-1]
(6)向量大小 : vec.size();
(7)清空向量 : vec.clear();
7、vector类型:int、double、string、struct;注意如果为struct类型;必须定义为全局、否则报错。
思路:res记录 遍历节点的值 ;stk是一个栈;压入、压出
定义一个节点;先将栈顶压入(res记录数据)--》遍历压入左子树(res记录数据)--》如果左子树为空,stack的top方法,返回栈顶,元素出栈---》遍历压入右子树(res记录数据) ---》结束。
res就是最后的结果
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res; //定义一个rector容器 int类型
stack<TreeNode*> stk; //定义一个stack容器 TreeNode*类型
TreeNode* cur = root; //定义一个 树节点 = 根节点
while(cur || stk.size()) { // cur!=null 或者 压入栈个数!=0
while(cur) { // cur 为真
stk.push(cur); // 压入栈
res.push_back(cur->val); //cur数值存入容器中
cur = cur->left; //左子树
}
cur = stk.top(); //回到栈顶
stk.pop(); //出栈
cur = cur->right; //右子树
}
return res;
}
};