二叉树的遍历
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define MAX_TREE_SIZE 100
typedef int Status;
typedef struct BTree
{
char data;
struct BTree *lchild;
struct BTree *rchild;
} BinTree;
BinTree* CreateTree(BinTree *T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
return NULL;
T=(BinTree *)malloc(sizeof(BinTree));
T->data=ch;
T->lchild=CreateTree(T->lchild);
T->rchild=CreateTree(T->rchild);
return T;
}
//先序遍历
void PreOrderTraverse(BinTree *T)
{
if(T)
{
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild );
}
}
//中序遍历
void InOderTraverse(BinTree *T)
{
if(T)
{
InOderTraverse(T->lchild);
printf("%c",T->data);
InOderTraverse(T->rchild );
}
}
//后序遍历
Status PreOrder(BinTree *T)
{
if(T)
{
PreOrder(T->lchild);
PreOrder(T->rchild );
printf("%c",T->data );
}
else return 1;
}
//求二叉树中所有结点数;
int CountNode(BinTree *T)
{
int count=0,a=0,b=0;
if(T)
{
a=CountNode(T->lchild);
b=CountNode(T->rchild);
count=a+b+1;
}
return count;
}
//求二叉树的深度;
static int depthval=0;
int Depth(BinTree *T)
{
int leftdepth,rightdepth;
if(T)
{
leftdepth=Depth(T->lchild);
rightdepth=Depth(T->rchild);
depthval=1+(leftdepth>rightdepth ? leftdepth:rightdepth);
}
else depthval=0;
return depthval;
}
//求二叉树的叶子结点个数。
int Sumleaf(BinTree *T)
{
int sum=0,m,n;
if(T)
{
if((!T->lchild)&&(!T->rchild ))
sum++;
m=Sumleaf(T->lchild);
sum+=m;
n=Sumleaf(T->rchild );
sum+=n;
}
return sum;
}
int main()
{
BinTree *Tree;
Tree=CreateTree(Tree);
printf("先序遍历:\n");
PreOrderTraverse(Tree);
printf("中序遍历:\n");
InOderTraverse(Tree);
printf("后序遍历:\n");
PreOrder(Tree);
printf("%d\n",CountNode(Tree));
printf("%d\n",Depth(Tree));
printf("%d\n",Sumleaf(Tree));
return 0;
}