1. 创建二叉树
因为在含有n个结点的二叉链表中一定有n+1个空指针域,所以在输入数据时一定要给出n+1个空指针值。
首先还是先要声明一下结构体 typedef char ElemType; typedef struct Node { ElemType data; struct Node *lchild,*rchild; }BitTree; BitTree *creBitTree(void) { BitTree *bt; ElemType x; scanf("%c",&x); if(x==' ')bt=NULL; else { bt = (BitTree*)malloc(sizeof(BitTree)); bt->data = x; bt->lchild = creBitTree(); bt->rchild = creBitTree(); } return bt; }
2,递归遍历算法
//先序遍历 void PreOrder(BitTree *bt) { if(bt!=NULL) { printf("%c",bt->data); PreOrder(bt->lchild); PreOrder(bt->rchild); } } //中序遍历 void InOrder(BitTree *bt) { if(bt!=NULL) { InOrder(bt->lchild); printf("%c",bt->data); InOrder(bt->rchild); } } //后序遍历 void PostOrder(BitTree *bt) { if(bt!=NULL) { PostOrder(bt->lchild); PostOrder(bt->rchild); printf("%c",bt->data); } }
3,非递归遍历算法
//先序遍历 void PreOrder(BitTree *T) { stack S; //自己实现的栈,以及一些函数 BitTree *p; InitStack(&S); push(&S,T); while(!EmptyStack(&S)) { p = pop(&S); while(p) { printf("%c ",p->data); if(p->rchild) push(&S,p->rchild); p = p->lchild; } } } //中序遍历 void InOrder(BitTree *T) { stack S; BitTree *p; InitStack(&S); p = T; while(p || !EmptyStack(&S)) { while(p) { push(&S,p); p = p->lchild; } p = pop(&S); printf("%c",p->data); p = p->rchild; } } //后序遍历 void PostOrder(BitTree *T) { stack S; BitTree *p,*q; InitStack(&S); p = T; q = NULL; while(p||!EmptyStack(&S)) { if(p!=q) { while(p) { push(&S,p); if(p->lchild) p=p->lchild; else p = p->rchild; } } if(EmptyStack(&S))break; q = gettop(&S); if(q->rchild==p) { p=pop(&S); printf("%c ",p->data); } else p = q->rchild; } }