二叉树的前序遍历
1.问题
2.思路
1.首先介绍下先根遍历—按照根-左儿子-右儿子的顺序遍历整棵二叉树
2.递归方法
3.迭代方法
栈不为空时,每次出栈一个结点,放入返回数组中!某个结点出栈之后其右左孩子入栈(有顺序!)
3.代码实现
(1)递归
class Solution {
public:
void PreOrder(TreeNode*cur,vector<int>& vec)
{
if(cur == NULL)return;
vec.push_back(cur->val);//根 访问!
PreOrder(cur->left,vec);//左
PreOrder(cur->right,vec);//右
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
PreOrder(root, result);
return result;
}
};
(2)迭代(利用栈)
//放二叉树结点的线性栈
class stack{
public:
//1.初始化
void InitStack(){
top = 0;
}
//2.二叉树指针压栈
void Push(TreeNode *p){
stack[top++] = p;
}
//3.弹栈
void Pop(){
top--;
}
//4.判空
bool Empty() {
if (top == 0)return true;
return false;
}
//5.取栈顶元素
TreeNode* Top( ){
return stack[top-1];
}
private:
int top;
TreeNode *stack[512];
};
//迭代法
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
stack st;
st.InitStack();//初始化
vector<int> result;
if(root == NULL) return result;
st.Push(root);//根结点入栈!
while(!st.empty())//栈不为空时
{
TreeNode* node = st.Top();//指针指向栈顶结点 //中
st.Pop();//出栈
result.push_back(node->val);
if(node->right) st.Push(node->right);//右儿子入栈!(空节点不入栈)
if(node->left) st.Push(node->left);//左儿子入栈!(空节点不入栈)
}
return result; //栈为空,结束
}
};