概述:
二叉树,这里采用孩子链表存储法,即一个数据域和两个左右孩子指针域。随后递归进行遍历即可。在创建二叉树的时候,先创建各个二叉树结点(这里的结点采用动态分配,因此结点为指针变量),随后,再根据逻辑结构图,手动通过左右指针域,链接到对应位置即可。
代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//二叉树结点
typedef struct BTnode
{int data;struct BTnode *lchild,*rchild;
}BTnode;BTnode* BuyNode(int x)
{//创建树的结点空间,动态分配。 BTnode* node =(BTnode*)malloc(sizeof(BTnode));//给结点赋值,指针域置空 node->data=x;node->lchild=NULL;node->rchild=NULL;return node;
}
//创建二叉树
BTnode* CreatTree()
{//创建树的结点 BTnode* node1 =BuyNode(1);//因为BuyNode是动态分配的空间,因此用指针接收 BTnode* node2 =BuyNode(2);BTnode* node3 =BuyNode(3);BTnode* node4 =BuyNode(4);BTnode* node5 =BuyNode(5);//手动链接起来。node1->lchild=node2;node1->rchild=node3;node2->lchild=node4;node2->rchild=node5; //链接完毕,返回头指针,即根结点return node1;
}
//打印树-前序遍历
void PreOrder(BTnode* root)
{if(root == NULL){printf("# ");return;//返回调用的上一级 }printf("%d ",root->data);PreOrder(root->lchild);PreOrder(root->rchild);
}
void InOrder(BTnode* root)//中序遍历
{if(root == NULL){printf("# ");return;//返回调用的上一级 }InOrder(root->lchild); //左 printf("%d ",root->data);//根 InOrder(root->rchild);//右 }
void PostOrder(BTnode* root)//后序遍历
{if(root == NULL){printf("# ");return;//返回调用的上一级 }PostOrder(root->lchild);//左 PostOrder(root->rchild);// 右 printf("%d ",root->data);//根 }
//计算树的结点,分治思想,分工,最后汇总。
int BTtreeSize(BTnode* root)
{if(root ==NULL)//树是空的,就返回0 return 0;else//不是空的,就进行左右子树遍历再加1,因为要给本身加上。空根不加一,但这里非空,必定+1; {//递归到叶子节点时,叶子节点的左右子树都为空,返回0,0+0+1=1,因此叶子节点再往上一层返回即可。 return BTtreeSize(root->lchild)+BTtreeSize(root->rchild)+1; }
}
//计算树的叶子节点
int LeafSizes(BTnode* root)
{//是空根就返回0if(root ==NULL)return 0;//符合叶子结点特征,即结点的左右子树均为空,则返回1,即记录上 if(root->lchild ==NULL && root->rchild==NULL )return 1;else//都不符合,便进入左右子树,进行递归计算,最后汇总即可。 return LeafSizes(root->lchild)+LeafSizes(root->rchild); //实在不明白,画个递归图,就明白了。
} int main()
{BTnode* root=CreatTree();//遍历递归打印时,每个结点调用结束,销毁空间,返回上一级调用位置。//直到所有结点遍历结束,临时空间逐个销毁。 printf("前序遍历:");PreOrder(root);printf("\n中序遍历:");InOrder(root);printf("\n后序遍历:");PostOrder(root); //计算树的结点 int count=BTtreeSize(root);printf("\n树有%d个结点",count);int leafcount=LeafSizes(root);printf("\n树有%d个叶子结点",leafcount);return 0;}
结果: