例如 01*49**8**25**6** ABD***CE**FG*** 01*49**8**25**6*37***
- #include<stdio.h>
- #include<stdlib.h>
- #include<malloc.h>
- #define ERROR -1
- typedef char DataType;
- typedef struct TreeNode
- {
- DataType elem;
- struct TreeNode* rchild;
- struct TreeNode* lchild;
- }TreeNode, *PTREE;
- //先序创建
- void CreatTree(PTREE *Root) {
- char val = 0;//用于下面存放数据
- val = getchar();//输入数据值
- //如果输入'*',则指向为空
- if (val == '*'|| val == '#' || val == '.')
- (*Root) = NULL;
- //如果输入非'*',则给数据域赋值
- else {
- (*Root) = (PTREE)malloc(sizeof(TreeNode));//申请内存空间
- if ((*Root) == NULL) {
- printf("创建结点失败,无法分配可用内存...");
- exit(-1);
- }
- else {
- (*Root)->elem = val;//给结点数据域赋值
- CreatTree(&(*Root)->lchild);
- CreatTree(&(*Root)->rchild);
- }
- }
- }
- //前序遍历
- void PreOrderTree(PTREE Root) {
- if (Root == NULL)
- return;
- else {
- putchar(Root->elem);
- PreOrderTree(Root->lchild);
- PreOrderTree(Root->rchild);
- }
- }
- //结点个数01*49**8**25**6** ABD***CE**FG*** 01*49**8**25**6*37***
- int GetNodeNum(PTREE Tree)
- {
- if (NULL == Tree)
- {
- return 0;
- }
- else
- {
- return GetNodeNum(Tree->lchild) + GetNodeNum(Tree->rchild) + 1;
- }
- }
- //叶子结点个数
- int GetLeafNum(PTREE Tree)
- {
- if (Tree == NULL)
- return 0;
- if (Tree->lchild == NULL&&Tree->rchild == NULL)
- return 1;
- return GetLeafNum(Tree->lchild) + GetLeafNum(Tree->rchild);
- }
- //度为1结点个数
- int GetNodde1Num(PTREE Tree)
- {
- if (Tree == NULL)
- return 0;
- if (Tree->lchild == NULL&&Tree->rchild != NULL || Tree->rchild == NULL&&Tree->lchild != NULL)
- return 1 + GetNodde1Num(Tree->lchild) + GetNodde1Num(Tree->rchild);
- return GetNodde1Num(Tree->lchild) + GetNodde1Num(Tree->rchild);
- }
- //度为2结点个数
- int GetNodde2Num(PTREE Tree)
- {
- if (Tree == NULL)
- return 0;
- if (Tree->lchild != NULL&&Tree->rchild != NULL)
- return 1+ GetNodde2Num(Tree->lchild) + GetNodde2Num(Tree->rchild);
- return GetNodde2Num(Tree->lchild) + GetNodde2Num(Tree->rchild);
- }
- int main(void)
- {
- PTREE root;
- printf("请输入前序 *或#或.为空\t");
- CreatTree(&root);
- printf("前序遍历 :\t");
- PreOrderTree(root);
- printf("\n");
- printf("递归求所有结点 %d\n", GetNodeNum(root));
- printf("等式求所有结点 %d\n", GetLeafNum(root)+ GetNodde2Num(root) + GetNodde1Num(root));
- printf("递归求所有叶子结点 %d\n", GetLeafNum(root));
- printf("性质求所有叶子结点 %d\n", GetNodde2Num(root)+1);
- printf("递归求所有度为1的结点 %d\n", GetNodde1Num(root));
- printf("等式求所有度为1的结点 %d\n", GetNodeNum(root)- GetLeafNum(root)- GetNodde2Num(root));
- printf("递归求所有度为2的结点 %d\n", GetNodde2Num(root));
- printf("性质求所有度为2的结点 %d\n", GetLeafNum(root)-1);
- printf("总结: 根据书中的性质3和一个等式,只要有两个数据(度2和度0算一个),其他数据都可以算出\n");
- system("pause");
- return 0;
- }