"."代表空树,程序分别以先序、中序和后序的方式递归遍历二叉树,再以中序非递归的方式遍历二叉树,并以中序递归方式输出叶子结点并统计叶子结点的个数。最后将二叉树线索化并中序遍历线索二叉树。
#include "stdio.h" #include "stdlib.h" typedef struct bithrnode { char data; int ltag,rtag; struct bithrnode *lchild,*rchild; }BithrNODE; int link=0; int thread=1; int N0=0; BithrNODE *pre; BithrNODE *BithrCreat() { char x; BithrNODE *p=NULL; scanf("%c",&x); if(x=='.') return NULL; p=(BithrNODE *)malloc(sizeof(BithrNODE)); p->data=x; p->ltag=p->rtag=link; p->lchild=BithrCreat(); p->rchild=BithrCreat(); return p; } void Visit(char ch) { printf("%c ",ch); } void PreOrder(BithrNODE *root) /*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if (root!=NULL) { Visit(root->data); /*访问根结点*/ PreOrder(root->lchild); /*先序遍历左子树*/ PreOrder(root->rchild); /*先序遍历右子树*/ } } void InOrder(BithrNODE * root) /*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if(root!=NULL) { InOrder(root->lchild); /*中序遍历左子树*/ Visit(root->data); /*访问根结点*/ InOrder(root->rchild); /*中序遍历右子树*/ } } void PostOrder(BithrNODE * root) /*后序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/ { if(root!=NULL) { PostOrder(root->lchild); /*后序遍历左子树*/ PostOrder(root->rchild); /*后序遍历右子树*/ Visit(root->data); /*访问根结点*/ } } void PreLeaf(BithrNODE * root) /*前序遍历的叶子结点输出*/ { if(root!=NULL) { if(root->lchild==NULL&&root->rchild==NULL) { Visit(root->data); N0++; } PreLeaf(root->lchild); PreLeaf(root->rchild); } } void inorder1(BithrNODE * t) { BithrNODE * s[32]; // s是指针数组,数组中元素为二叉树节点的指针 int top = -1; while (t!=NULL || top != -1) { // 压栈直到左子树为空 while (t != NULL) { s[++top] = t; t = t->lchild; } if (top != -1) { t = s[top--]; // 出栈 Visit(t->data); t = t->rchild; // 指向该节点的右孩子,回到while循环压栈 } } } void InThreading(BithrNODE *a) { if(a) { InThreading(a->lchild); if(!a->lchild) { a->ltag=thread; a->lchild=pre; } if(!pre->rchild) { pre->rtag=thread; pre->rchild=a; } pre=a; InThreading(a->rchild); } } BithrNODE *InOrderThreading(BithrNODE *a) { BithrNODE *h=(BithrNODE *)malloc(sizeof(BithrNODE )); if(!h) exit(-1); h->ltag=link; h->rtag=thread; h->rchild=h; if(!a) h->lchild=h; else { h->lchild=a; pre=h; InThreading(a); pre->rtag=thread; pre->rchild=h; h->rchild=pre; } return h; } void InOrderTraverse(BithrNODE *a) { BithrNODE *p=a->lchild; while(p!=a) { while(p->ltag==link) p=p->lchild; Visit(p->data); while(p->rtag==thread&&p->rchild!=a) { p=p->rchild; Visit(p->data); } p=p->rchild; } } int main() { BithrNODE *a=BithrCreat(); printf("先序遍历二叉树: "); PreOrder(a); printf("\n中序遍历二叉树: "); InOrder(a); printf("\n后序遍历二叉树: "); PostOrder(a); printf("\n叶子结点: "); PreLeaf(a); printf("\n叶子结点个数: "); printf("%d",N0); printf("\n中序非递归遍历: "); inorder1(a); printf("\n中序线索化二叉树,中序遍历所建立的线索二叉树: "); a=InOrderThreading(a); InOrderTraverse(a); printf("\n"); return 0; }
原文地址:http://blog.csdn.net/jackeriss/article/details/40725067