前序遍历
void preOrder(TreeNode* p){
if(!p)return;
TreeNode* t;
t = p;
stack<TreeNode*> nodes;
nodes.push(t);
while(!nodes.empty()){
t = nodes.top();
nodes.pop();
Visit(t);
if(t->right)
nodes.push(t->right);
if(t->left)
nodes.push(t->left);
}
cout<<endl;
}
//数组实现的栈结构
void preorderNonrecursion(TreeNode *bt){
if(bt!=NULL){
TreeNode *Stack[MAXLEN];
int top = -1;
TreeNode *p;
Stack[++top] = bt;
while(top!=-1){
p = Stack[top--];
Visit(p);
if(p->right!=NULL)
Stack[++top] = p->right;
if(p->left!=NULL)
Stack[++top] = p->left;
}
}
}
中序遍历
思路:
根结点入栈。
循环:栈顶结点遍历到最左结点,每个结点都入栈。然后访问栈顶结点并出栈,该结点右结点入栈(没有就设为NULL)
void inOrder(TreeNode* p){
if(!p)return;
TreeNode* t;
t = p;
stack<TreeNode*> nodes;
nodes.push(t);
while(!nodes.empty()){
while(t&&t->left){
t = t->left;
nodes.push(t);
}
t = nodes.top();
Visit(t);
nodes.pop();
if(t->right){
t = t->right;
nodes.push(t);
}else
t= NULL;
}
cout<<endl;
}
//数组实现栈结构
void inorderNonrecursion(TreeNode *bt){
if(bt!=NULL){
TreeNode *Stack[MAXLEN];
int top = -1;
TreeNode *p;
p = bt;
while(top!=-1||p!=NULL){
//深度遍历,直到没有左结点
while(p!=NULL){
Stack[++top] = p;
p = p->left;
}
if(top!=-1){
p = Stack[top--];
Visit(p);
p = p->right;
}
}
}
}
后序遍历
解析:
简单方法----后序遍历其实是对原树的镜像树先序遍历的数组倒序的结果。
可以将原树的镜像树先序遍历的数组存入栈中,最后倒着全部输出即可。
void postorderNonrecursion(TreeNode *bt){
if(bt!=NULL){
TreeNode *Stack1[MAXLEN];
TreeNode *Stack2[MAXLEN];
int top1 = -1;
int top2 = -1;
TreeNode *p;
Stack1[++top1] = bt;
while(top1!=-1){
p = Stack1[top1--];
Stack2[++top2] = p;
if(p->left!=NULL)
Stack1[++top1] = p->left;
if(p->right!=NULL)
Stack1[++top1] = p->right;
}
while(top2!=-1){
p = Stack2[top2--];
Visit(p);
}
}
}