0二叉树结构体定义
typedef struct BTNode{
int data;
struct BTNode * lchild;
struct BTNode * rchild;
}BTNode;
1.递归遍历
先序(访问根结点,先序遍历左子树,先序遍历右子树)
void PreOrder(BTNodey T){
if(T!=NULL){
visit(T);
preOrder(T->lchild);
preOrder(T->rchild);
}
}
中序(中序遍历左子树,访问根结点,中序遍历右子树)
void InOrder(BTNode T){
if(T!=NULL){
InOrder(T->lchild);
visit(T);
InOrder(T->rchild);
}
}
后序(后序遍历左子树,后序遍历右子树,访问根结点)
void PostOrder(BTNode T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
}
}
2.非递归遍历
先序遍历
- 沿着根的左孩子,先访问并依次入栈,直到左孩子为空(一直到最下层的左孩子停止);
2.(判断:没有右子树了) 栈顶元素出栈,接着若右孩子为空,继续执行2;若不为空,将右子树的操作转为1;
void PreOrder(BTNode T) {
LinkStack S;
InitStack(S);
BTNode p = T;
while(p || !IsEmpty(S)) {
if(p) {
visit(p);
Push(S, p);
p = p->lchild;
} else {
Pop(S, p);
p = p->rchild;
}
}
}
中序遍历
- 沿着根的左孩子,依次入栈,直到左孩子为空(一直到最下层的左孩子停止);
2.(判断:没有左子树了) 栈顶元素出栈并访问,接着若右孩子为空,继续执行2;若不为空,将右子树的操作转为1;
void InOrder(BTNode T) {
LinkStack S;
InitStack(S);
BTNode p = T;
while(p || !IsEmpty(S)) {
if(p) {
Push(S, p);
p = p->lchild;
} else {
Pop(S, p);
visit(p);
p = p->rchild;
}
}
}
后序遍历
- 沿着根的左孩子,依次入栈,直到左孩子为空(一直到最下层的左孩子停止);
2.读取栈顶元素:若其右孩子不空且未被访问过,将右子树转执行1;否则,栈顶元素出栈并访问。 ;
void PostOrder(BTNode T) {
LinkStack S;
InitStack(S);
BTNode p = T;
BTNode r = NULL;
while(p || !IsEmpty(S)) {
if(p) {
Push(S, p);
p = p->lchild;
} else {
GetTop(S, p);
if(p->rchild && p->rchild != r) {
p = p->rchild;
} else {
Pop(S, p);
visit(p);
r = p;
p = NULL;
}
}
}
}