第3个回答 2009-05-31
/* 测试数据:9 8 7 4 5 6 3 2 1 10 11 12 0 */
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define INPUT "%d"
#define OUTPUT "%d "
typedef int DataType;
typedef struct BSTNode
{
DataType data;
struct BSTNode *lchild;
struct BSTNode *rchild;
} BSTNode, *pBSTNode;
/* 清空二叉搜素树,回收所有节点内存 */
void Clear(pBSTNode root)
{
if (root)
{
Clear(root->lchild);
Clear(root->rchild);
free(root);
}
}
/* 输入节点值 */
void Insert(pBSTNode *root, DataType item)
{
pBSTNode cursor = *root, newnode = (pBSTNode)malloc(sizeof(BSTNode));
newnode->lchild = newnode->rchild = NULL;
newnode->data = item;
if (!*root)
{
*root = newnode;
return;
}
while (cursor)
{
if (item < cursor->data)
{
if (!cursor->lchild)
{
cursor->lchild = newnode;
return;
}
cursor = cursor->lchild;
}
else
{
if (!cursor->rchild)
{
cursor->rchild = newnode;
return;
}
cursor = cursor->rchild;
}
}
}
/* 先序遍历 */
void PreOrder(pBSTNode root)
{
if (root)
{
printf(OUTPUT, root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
/* 中序遍历 */
void InOrder(pBSTNode root)
{
if (root)
{
InOrder(root->lchild);
printf(OUTPUT, root->data);
InOrder(root->rchild);
}
}
/* 后缀遍历 */
void PostOrder(pBSTNode root)
{
if (root)
{
PostOrder(root->lchild);
PostOrder(root->rchild);
printf(OUTPUT, root->data);
}
}
/* 计算叶子个数 */
int SumLeaf(pBSTNode root)
{
if (root)
{
if (root->lchild == NULL && root->rchild == NULL)
return 1;
else
return SumLeaf(root->lchild) + SumLeaf(root->rchild);
}
return 0;
}
int main()
{
pBSTNode root = NULL;
DataType data;
while (1)
{
scanf(INPUT, &data);
/* 输入数据为0退出循环 */
if (data == 0)
break;
Insert(&root, data);
}
printf("\n\n");
printf("节点值:");
InOrder(root);
printf("\n\n");
printf("叶子数:%d\n", SumLeaf(root));
Clear(root);
return 0;
}