赞
踩
概述:
二叉树,这里采用孩子链表存储法,即一个数据域和两个左右孩子指针域。随后递归进行遍历即可。在创建二叉树的时候,先创建各个二叉树结点(这里的结点采用动态分配,因此结点为指针变量),随后,再根据逻辑结构图,手动通过左右指针域,链接到对应位置即可。
代码如下:
- #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)
- {
- //是空根就返回0
- if(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;
- }
结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。