这个我写过,看看下面有没有你要的,我调试过的
/* 递归法 */
#include
#define MAX 100
typedef struct BTNode
{
char data;
struct BTNode *lchild;
struct BTNode *rchild;
} BTNode, *BiTree;
int main()
{
BiTree T=NULL;
printf("\ninput the tree number:");
/* CreateBiTree( &T ); */
Creat_BiTree( &T);
printf("\nthe preorder is:");
PreOrderTraverse( T );
printf("\nthe pre_traverse is:");
Pre_Traverse( T );
printf("\nthe inorder is:");
InOrderTraverse( T );
printf("\nthe in_traveras is:");
In_Traverse( T );
printf("\nthe postorder is:");
PostOrderTraverse( T );
printf("\nthe post_traverse is:");
Post_Traverse( T );
printf("\nthe levelorder is:");
LevelorderTraverse( T );
printf("\nthe depth of tree is:%d", DepthTree(T));
printf("\nthe 2 nodes of all the tree is:%d", BiTree_2Node(T));
BT_Exchange(T);
printf("\noutput after exchang:");
PreOrderTraverse( T );
printf("\nthe leaf is:%d", Count_Leaf(T));
}
int CreateBiTree(BiTree *T) /* 先序遍历创建一棵二叉树 */
{
char ch ;
ch = getchar();
if(ch == '#')
(*T) = NULL;
else
{
(*T) = (BiTree)malloc(sizeof(BTNode));
(*T)->data = ch;
CreateBiTree( &(*T)->lchild );
CreateBiTree( &(*T)->rchild );
}
}
int PreOrderTraverse(BiTree T) /* 先序遍历 */
{
if(T)
{
printf("%2c", T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
int InOrderTraverse(BiTree T) /* 中序遍历 */
{
if(T)
{
InOrderTraverse(T->lchild);
printf("%2c", T->data);
InOrderTraverse(T->rchild);
}
}
int PostOrderTraverse(BiTree T) /* 后序遍历 */
{
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%2c", T->data);
}
}
int LevelorderTraverse(BiTree T) /* 层次遍历 */
{
BTNode *Queue[MAX], *p;
int front = -1, rear = -1;
rear = (rear+1)%MAX;
Queue[rear] = T;
while( front != rear)
{
front = (front+1) % MAX;
p = Queue[front];
printf("%2c", p->data);
if(p->lchild)
{
rear = (rear+1)%MAX;
Queue[rear] = p->lchild;
}
if(p->rchild)
{
rear = (rear+1)%MAX;
Queue[rear] = p->rchild;
}
}
}
int DepthTree(BiTree T) /* 求树的高度 */
{
int depth1, depth2;
if(T == NULL)
return 0;
else
{
depth1 = DepthTree(T->lchild);
depth2 = DepthTree(T->rchild);
return depth1 > depth2 ? depth1+1 : depth2+1;
}
}
int BiTree_2Node(BiTree T) /* 统计结点的度为2的数*/
{
int n1, n2;
if(T == NULL) return 0;
else
{
n1 = BiTree_2Node(T->lchild);
n2 = BiTree_2Node(T->rchild);
if(T->lchild && T->rchild )
return 1+n1+n2;
else
return n1+n2;
}
}
int BT_Exchange(BiTree T) /* 交换二叉树的左右结点 */
{
BTNode *p;
if( T != NULL)
{
p = T->lchild;
T->lchild = T->rchild;
T->rchild = p;
BT_Exchange( T->lchild );
BT_Exchange( T->rchild );
}
}
int count=1;
int Count_Leaf(BiTree T) /* 计算树的叶子结点 */
{
if( T == NULL) return 0;
if(T->lchild == NULL && T->rchild == NULL)
return count++;
Count_Leaf(T->lchild);
Count_Leaf(T->rchild);
}
/* 非递归法*/
int Creat_BiTree(BiTree *T) /* 非递归创建二叉树*/
{
BTNode *stack[MAX], *p;
int top = -1, j=0, k, i=0;
char ch, str[MAX];
while(ch != '.')
{
ch = getchar();
str[j++] = ch;
}
(*T) = NULL;
ch = str[i];
while(ch != '\0')
{
switch(ch)
{
case '(' : top++ ;
stack[top] = ch;
k = 1;
break;
case ')' : top--;
break;
case ',' : k = 2;
break;
default: p = (BTNode *)malloc(sizeof(BTNode));
p->data = ch;
p->lchild = NULL;
p->rchild = NULL;
}
if( (*T) == NULL)
(*T) = p;
else
{
switch( k )
{
case 1: stack[top]->lchild = p;
break;
case 2: stack[top]->rchild = p;
break;
}
}
ch = str[++i];
}
}
int Pre_Traverse(BiTree T) /* 非递归先序遍历*/
{
BTNode * stack[MAX], *p;
int top = -1;
p = T;
do
{
while( p )
{
printf("%2c ", p->data);
top++;
stack[top] = p;
p = p->lchild;
}
if(top > -1)
{
p = stack[top];
top--;
p = p->rchild;
}
} while(top > -1 || p);
}
int In_Traverse(BiTree T) /* 中序非递归遍历*/
{
BTNode *stack[MAX], *p;
int top = -1;
p = T;
do
{
while( p )
{
top++;
stack[top] = p;
p = p->lchild;
}
if( top >-1)
{
p = stack[top];
printf("%2c ", p->data);
top--;
p = p->rchild;
}
} while(top > - 1 || p);
}
int Post_Traverse(BiTree T) /* 后序非递归遍历*/
{
BTNode *stack[MAX], *p, *q;
int top = -1, flag;
p = T;
do
{
while( p )
{
top++;
stack[top] = p;
p = p->lchild;
}
flag = 1;
q = NULL;
while( top > -1 && flag)
{
p = stack[top];
if(p->rchild == q)
{
printf("%2c ", p->data);
top--;
q = p;
}
else
{
p = p->rchild;
flag = 0;
}
}
} while(top > -1);
}
我看的清华版的数据结构,上面都有,基本上略作改动,再拼凑一下就可以实现.