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) {
vector<int> res;
stack<TreeNode*> st;
if(root!=NULL) st.push(root);
while(!st.empty()){
TreeNode* p = st.top();
st.pop();
res.push_back(p->val);
if(p->right!=NULL) st.push(p->right);
if(p->left!=NULL) st.push(p->left);
}
return res;
}
};
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> inorderTraversal(TreeNode* root) {
stack<const TreeNode*> st;
vector<int> res;
const TreeNode* pNode = root;
while(pNode||!st.empty()){
if(pNode!=NULL){
st.push(pNode);
pNode = pNode->left;
}
else{
pNode = st.top();
st.pop();
res.push_back(pNode->val);
pNode = pNode->right;
}
}
return res;
}
};
3.后续遍历非递归
二叉树的后序遍历顺序为,root->left, root->right, root,因此需要保存根节点的状态。显然使用栈来模拟递归的过程,但是难点是怎么从root->right转换到root。
A
B C
D E H
F
后序序列:DFEBHCA
对应代码里的栈s 入栈顺序: 自己对应代码进行模拟
方法1:
对于节点p可以分情况讨论
1. p如果是叶子节点,直接输出
2. p如果有孩子,且孩子没有被访问过,则按照右孩子,左孩子的顺序依次入栈
3. p如果有孩子,而且孩子都已经访问过,则访问p节点
如何来表示出p的孩子是否都已经访问过了呢?
pre表示刚刚访问过的结点,如果等于当前访问结点的孩子,就表示p的孩子都已经都访问过了,因为在栈里边,父节点是先进后出的。
pre!=NULL&&(pre==cur->lchild||pre==cur->rchild
代码如下:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
if(root!=NULL)
st.push(root);
TreeNode* pre = NULL;
TreeNode* p;
while(!st.empty()){
p = st.top();
if((p->left==NULL&&p->right==NULL)||((pre!=NULL)&&(pre==p->left||pre==p->right))){
res.push_back(p->val);
st.pop();
pre = p;
}
else{
if(p->right!=NULL) st.push(p->right);
if(p->left!=NULL) st.push(p->left);
}
}
return res;
}
};