69,371
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
#include<stdlib.h>
/********************************************************************/
/*二叉树相关操作*/
typedef struct tree *treelink; /*二叉树结点结构*/
typedef struct tree
{
int data; /*data为结点值*/
treelink left; /*left为指向左儿子的指针*/
treelink right;/*right为指向右儿子的指针*/
}treenode;
treelink Newtreenode() /*创建新结点并返回结点指针*/
{
treelink p;
if((p=(treelink)malloc(sizeof(treenode)))==0)
printf("Exhaused memory.");
else return p;
}
typedef struct binarytree *BinaryTree; /*指针实现的二叉树结构类型*/
typedef struct binarytree
{
treelink root; /*指向二叉树根结点的指针*/
}BTree;
void createtreenode(treelink p,int n) /*嵌套方式将一个数插入树中*/
{
if(n>p->data) /*如果此数大于结点值,则向结点的右儿子方向插入*/
{
if(p->right==0) /*如果结点右儿子为空,则创建此结点的右儿子*/
{
treelink q=Newtreenode();
q->data=n; q->right=0; q->left=0;
p->right=q;
}
else createtreenode(p->right,n);/*如果右儿子不空,则继续判断与此右儿子的关系*/
}
else /*如果此数小于结点值,则向结点的左儿子方向插入*/
{
if(p->left==0) /*如果结点左儿子为空,则创建此结点的左儿子*/
{
treelink q=Newtreenode();
q->data=n; q->right=0; q->left=0;
p->left=q;
}
else createtreenode(p->left,n);/*如果左儿子不空,则继续判断与此左儿子的关系*/
}
}
treelink createTree(int a[], int size) /*根据数组创建树,size为a[]数组大小*/
{
int i=1;
treelink root;
root=Newtreenode();
root->data=a[0]; root->right=0; root->left=0;/*将a[0]作为树根结点值*/
while(i<size) /*把a[1]至a[size-1]插入树中*/
{
createtreenode(root,a[i]);
i++;
}
return root;/*返回指向树根的指针*/
}
void outTree(treelink root) /*嵌套方式前序遍历树输出结点值*/
{
if(root!=0)
{
printf("%d\n",root->data);
outTree(root->left);
outTree(root->right);
}
}
int Leaves=0;//叶子数量
void coutLeaf(treelink root)//计算叶子节点
{
if(root!=0)
{
if(root->left==0 && root->right==0)
Leaves++;
coutLeaf(root->left);
coutLeaf(root->right);
}
}
/************************************************************/
/*主函数*/
int main()
{
int a[9]={5,6,4,8,2,3,7,1,9}; /*结点值数组*/
treelink root;
root=Newtreenode();
root=createTree(a,9); /*根据数组创建一个树得到树根*/
printf("前序遍历树结点值输出:\n");
outTree(root); /*前序遍历树输出结点值*/
coutLeaf(root);
printf("leaves:%d\n",Leaves);
getchar();
return 0;
}