4、二叉树:
#include <stdio.h>
#include<stdio.h>
#include<malloc.h>
#define NULL 0
#define MaxSize 100
struct TNode{
int data;
struct TNode *lchild;
struct TNode *rchild;
};
/*
BiTree* createBiTree ()
{ DataType ch;
BiTree * T;
ch=getchar();
if(ch=='#') return NULL;
else
{ T=(BiTree *)malloc(sizeof(BiTree));
T->data=ch;
T->lchild=createBiTree();
T->rchild=createBiTree();
return T;
}
}
*/
typedef struct TNode Node;
//初始化
void init(Node **node)
{
*node = (Node *)malloc(sizeof(Node));
(*node)->lchild = NULL;
(*node)->rchild = NULL;
(*node)->data = 0;
}
//构建
void construct(char data,Node **node)
{
Node *temp_node = *node;
while(temp_node)
{
if(!temp_node->data)
{
temp_node->data = data;
break;
}
else if(data<= temp_node->data)
{
if(!temp_node->lchild)
{
init(&temp_node->lchild);
temp_node->lchild->data = data;
break;
}
else
{
temp_node = temp_node->lchild;
continue;
}
}
else if(data>temp_node->data)
{
if(!temp_node->rchild)
{
init(&temp_node->rchild);
temp_node->rchild->data = data;
break;
}
else
{
temp_node = temp_node->rchild;
continue;
}
}
else if(temp_node->data)
break;
}
return;
}
void xianxu(Node *tree_node) //根左右
{
if(tree_node){
printf("%d ",tree_node->data);
xianxu(tree_node->lchild);
xianxu(tree_node->rchild);
}
}
void zhongxu(Node *tree_node) //左根右
{
if(tree_node){
xianxu(tree_node->lchild);
printf("%d ",tree_node->data);
xianxu(tree_node->rchild);
}
}
void houxu(Node *tree_node) //左右根
{
if(tree_node){
xianxu(tree_node->lchild);
xianxu(tree_node->rchild);
printf("%d ",tree_node->data);
}
}
//统计总共有多少个叶子节点
int leafnum(Node *tree_node)
{
if(tree_node){
if(tree_node->lchild==NULL&&tree_node->rchild==NULL)
return 1;
else
{
return leafnum(tree_node->lchild)+leafnum(tree_node->rchild);
}
}else
return 0;
}
//求树的深度
int deepfunc(Node *tree_node)
{
int lnum;
int rnum;
if(!tree_node)
return 0;
if(tree_node->lchild==NULL&&tree_node->rchild==NULL)
return 1;
else
{
lnum=deepfunc(tree_node->lchild);
rnum=deepfunc(tree_node->rchild);
return lnum>=rnum?(lnum+1):(rnum+1);
}
}
//在一个树上查找是否存在某个特定的叶子结点 0未找到,1找到:
int findTree(Node *tree_node,int num)
{
if(!tree_node)
return 0;
if(tree_node->data==num)
return 1;
else if(findTree(tree_node->lchild,num))
{
return 1;
}else
return findTree(tree_node->rchild,num);
}
//交换每个叶子结点的左右子树
void trans(Node *tree_node,Node *pnode)
{
if(!tree_node)
return;
pnode=tree_node->lchild;
tree_node->lchild=tree_node->rchild;
tree_node->rchild=pnode;
trans(tree_node->lchild,pnode);
trans(tree_node->rchild,pnode);
}
void main()
{
int i;
int num=0;
int n;
Node *root;
Node *pnode;
int data[7] = {45,24,53,45,12,24,90};
init(&root);
for(i=0;i<7;i++)
construct(data[i],&root);
printf("\nxianxu:\n");
xianxu(root);
printf("\nzhongxu:\n");
zhongxu(root);
printf("\nhouxu:\n");
houxu(root);
printf("\n叶子节点的个数:\n");
num=leafnum(root);
printf("%d\n",num);
printf("\n树的深度:\n");
printf("%d\n",deepfunc(root));
printf("\n是否找到某个特定的元素:\n");
scanf("%d",&n);
if(findTree(root,n)==1)
printf("\YES\n");
else
printf("\NO\n");
printf("交换每个结点的左右子树:\n");
trans(root,pnode);
xianxu(root);
}