中序后序遍历
知识点总结报告
知识点:
中序遍历
(原理)中序遍历二叉树过程
(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
中序遍历递归算法
void InOrder(BTNode *b) //中序遍历的递归算法
{ if (b!=NULL)
{ InOrder(b->lchild); //递归访问左子树
printf("%c ",b->data); //访问根节点
InOrder(b->rchild); //递归访问右子树
}
}
中序遍历非递归算法
void InOrder1(BTNode *b) //中序遍历非递归算法
{ BTNode *p;
SqStack *st; //定义一个顺序栈指针st
InitStack(st); //初始化栈st
p=b;
while(!StackEmpty(st)||p!=NULL)
{ while(p!=NULL) //扫描结点p的所有左下结点并进栈
{ Push(st,p); //结点p进栈
p=p->lchild; //移动到左孩子
}
if(!StackEmpty(st)) //若栈不空
{ Pop(st,p); //出栈结点p
printf("%c",p->data); //访问结点p
p=p->rchild; //转向处理其右子树
}
}
printf("\n");
DestroyStack(st); //销毁栈
}
后序遍历
(原理)后序遍历二叉树过程
(1)后序遍历左子树
(2)后序遍历右子树
(3)访问根结点
后序遍历递归算法
void PostOrder(BTNode *b) //后序遍历的递归算法
{ if (b!=NULL)
{ PostOrder(b->lchild); //递归访问左子树
PostOrder(b->rchild); //递归访问右子树
printf("%c ",b->data); //访问根节点
}
}
后序遍历非递归算法
void PostOrder1(BTNode *b) //后序遍历非递归算法
{ BTNode *p,*r;
SqStack *st; //定义一个顺序栈指针st
InitStack(st); //初始化栈st
p=b;
do
{ while(p!=NULL) //扫描结点p的所有左下结点并进栈
{ Push(st,p); //结点p进栈
p=p->lchild; //移动到左孩子
}
r=NULL; //r指向刚访问的结点,初始时为空
Flag=true; //flag为真表示正在处理栈顶结点
while(!StackEmpty(st)&&flag)
{ GetTop(st,p); //取出当前的栈顶结点p
if(p->rchild==r) //若结点p的右孩子为空或者为刚刚访问过的结点
{ printf("%c",p->data); //访问结点p
Pop(st,p);
r=p; //r指向刚访问过的结点
}
else
{ p=p->rchild; //转向处理其右子树
flag=false; //表示当前不是处理栈顶结点
}
}
}while(!StackEmpty(st)); //栈不空循环
printf("\n");
DestroyStack(st); //销毁栈
}