DS之求解二叉树的叶子结点和深度
来源:互联网 发布:php 获取session数据 编辑:程序博客网 时间:2024/04/30 05:23
这一次需要用到的是二叉树的相关知识,具体的解释会在后面的博客讲述。
如果实现上面的功能就先要构造二叉树以及创造二叉树,还需要求解叶子结点个数函数以及深度函数,这都需要自己去在数据结构的要求中实现。
首先来看二叉树的二叉链表的存储表示:
<span style="font-size:18px;">typedef struct BiTNode//重新定义二叉树的二叉链表的结构{ TElemType data; struct BiTNode *lchild,*rchild; //左右孩子指针}BiTNode,*BiTree;</span>
这个结构表示二叉链表的数据域和左右孩子指针域。
再来看看需要实现功能的前期准备:
<span style="font-size:18px;">//0前期准备#include <iostream>#include <Cstdlib>using namespace std;#define OK 1#define FALSE 0#define TRUE 1#define ERROR 0#define OVERFLOW -2typedef char TElemType;//重新定义char为TElemTypetypedef int Status;//重新定义int为Statustypedef struct BiTNode//重新定义二叉树的二叉链表的结构{ TElemType data; struct BiTNode *lchild,*rchild; //左右孩子指针}BiTNode,*BiTree;</span>
再者就是需要二叉树的二叉链表的基本操作1:
<span style="font-size:18px;">Status CreateBiTree(BiTree &T)//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树{int i=0;char a[100];//定义的字符数组 cin>>a[i]; if(a[i]=='#') { T=NULL;} else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) {exit(OVERFLOW);} T->data=a[i];//生成根结点 CreateBiTree(T->lchild);//构造左子树 CreateBiTree(T->rchild);//构造右子树 } return OK;}</span>
然后就是要定义求解叶子结点个数的函数:
<span style="font-size:18px;">int leafcount(BiTree T)//计算树的叶子结点的个数{if(!T){return 0;} else{ if(!T->lchild&&!T->rchild) {return 1;} else {return leafcount(T->lchild)+ leafcount(T->rchild);} }}</span>
再然后就是要定义求解树深度的函数(两个):
<span style="font-size:18px;">int get_depth(BiTree T){int m,n;if(!T){return 0;} else {m=get_depth(T->lchild); n=get_depth(T->rchild); return (m>n?m:n)+1;}}void get_sub_depth(BiTree T,char x)//返回二叉树深度的函数{ if(T->data==x) {cout<<get_depth(T); } else {if(T->lchild){get_sub_depth(T->lchild,x);} if(T->rchild){get_sub_depth(T->rchild,x);} }}</span>
最后就是主函数中的处理。
完整的求解代码为:
<span style="font-size:18px;">#include <iostream>#include <Cstdlib>using namespace std;#define OK 1#define FALSE 0#define TRUE 1#define ERROR 0#define OVERFLOW -2typedef char TElemType;//重新定义char为TElemTypetypedef int Status;//重新定义int为Statustypedef struct BiTNode//重新定义二叉树的二叉链表的结构{ TElemType data; struct BiTNode *lchild,*rchild; //左右孩子指针}BiTNode,*BiTree;Status CreateBiTree(BiTree &T)//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树{int i=0;char a[100];//定义的字符数组 cin>>a[i]; if(a[i]=='#') { T=NULL;} else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) {exit(OVERFLOW);} T->data=a[i];//生成根结点 CreateBiTree(T->lchild);//构造左子树 CreateBiTree(T->rchild);//构造右子树 } return OK;}int leafcount(BiTree T)//计算树的叶子结点的个数{if(!T){return 0;} else{ if(!T->lchild&&!T->rchild) {return 1;} else {return leafcount(T->lchild)+ leafcount(T->rchild);} }}int get_depth(BiTree T){int m,n;if(!T){return 0;} else {m=get_depth(T->lchild); n=get_depth(T->rchild); return (m>n?m:n)+1;}}void get_sub_depth(BiTree T,char x)//返回二叉树深度的函数{ if(T->data==x) {cout<<get_depth(T); } else {if(T->lchild){get_sub_depth(T->lchild,x);} if(T->rchild){get_sub_depth(T->rchild,x);} }}int main(){ BiTree T;//定义二叉树 CreateBiTree(T);//先序构造二叉树 cout<<"这棵树叶子的结点个数为:";cout<<leafcount(T);cout<<endl; cout<<"这棵树的深度为:";get_sub_depth(T,'A');cout<<endl; return 0;}</span>
输入的数据:先序输入ABC##DE#G##F###(#代表空)
这棵树的图为:
输出的结果为:
1 0
- DS之求解二叉树的叶子结点和深度
- 求二叉树的深度、宽度和叶子结点数
- 求二叉树的叶子结点个数及深度
- 二叉树 (求叶子结点&深度)
- 二叉树(求深度、叶子结点)
- 递归求解二叉树任意一结点的深度
- 求解最优二叉树所有叶子结点的带权路径长度之和
- 求二叉树的叶子结点数
- 输入二叉树,求父,左,右结点和深度,叶子数
- 二叉树的操作:创建、遍历、求树的深度、叶子结点数
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- C二叉树的基本操作---创建、遍历、求深度、求叶子结点
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- 二叉树的创建以及四种遍历,叶子结点的数量,二叉树深度(简单二叉树)
- 数据结构之二叉树深度的求解
- 【算法导论】求二叉树的叶子数和深度
- 二叉树的深度和叶子节点数
- 二叉树的基本操作精集(创建、遍历、求深度结点以及叶子结点个数)
- 自定义标签JSTL+国际化
- 嵌套类与局部类
- 毕业设计
- [刷题]Jump Game
- __thread关键字
- DS之求解二叉树的叶子结点和深度
- 二维数组的鞍点问题(c++)
- [刷题]Jump Game II
- C# 截图
- JAVA程序设计基础教程 抽象类、接口与包
- assert()函数用法总结
- Axure RP Pro7.0 之 动态面板初步使用
- 二叉搜索树 hdu 3791
- 欢迎使用CSDN-markdown编辑器