问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据结构算法设计——统计二叉树叶子结点的个数,并输出结果

发布网友 发布时间:2022-04-24 18:34

我来回答

4个回答

热心网友 时间:2023-11-01 23:10

代码如下:

#include<stdio.h>

#include<stdlib.h>

typedef struct BiTNode

{

char data;

struct BiTNode *lchild,*rchild;

}BiTNode,*BiTree;

void CreatTree(BiTree &A)

{

char ch;

scanf("%c",&ch);

if(ch=='#')

{

A=NULL;

}

else

{

A=new BiTNode;

A->data=ch;

CreatTree(A->lchild);

CreatTree(A->rchild);

}

}

int NodeTree(BiTree A)

{

if(A==NULL)

return 0;

else if(A->lchild==NULL&&A->rchild==NULL)

return 1;

else

return NodeTree(A->lchild)+NodeTree(A->rchild);

}

int main()

{

BiTree  A;

int b;

printf("先序法赋值(空用#表示):");

CreatTree(A);

b=NodeTree(A);

printf("共有%d个叶子节点\n",b);

}

扩展资料

二叉树的性质

1、对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;

2、有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:

若I为结点编号则 如果I>1,则其父结点的编号为I/2;

如果2*I<=N,则其左孩子(即左子树的根结点)的编号为2*I;若2*I>N,则无左孩子;

如果2*I+1<=N,则其右孩子的结点编号为2*I+1;若2*I+1>N,则无右孩子。

3、给定N个结点,能构成h(N)种不同的二叉树。h(N)为卡特兰数的第N项。h(n)=C(2*n,n)/(n+1)。

4、设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i[2]

热心网友 时间:2023-11-01 23:10

同学,你们老师和我们老师留的作业是一模一样的阿,我有现成的做好了的程序,调试成功。这个程序的难点就在于这种很别扭的输入形式,所以我为它设计了一个结构体形式存放输入内容,再将它转化成了线性结构。

#include <iostream.h>
#include <stdlib.h>

struct inform /*建立输入信息结构体inform*/
{ char data;

int l;

int r;

int signl; /*作为标记的signl,signr*/

int signr;
};

struct leafnode /*建立叶子节点结构体*/
{
char leaf;

leafnode* lchild;

leafnode* rchild;

};

void print(inform* ps, int n);

void judge ( inform* ps );

leafnode* creatree(); /*声明二叉树的建立函数*/

void preorder (leafnode* T); /*声明先序遍历函数*/

void inorder (leafnode* T); /*声明中序遍历函数*/

void postorder (leafnode* T); /*声明后序遍历函数*/

char a[100];

int k=1;
int s=0;

inform *p;

void main()
{
/*-------------------------------按格式输入信息-----------------------------------*/

int n;

cout<<"请输入二叉树内容:第一行为节点总数n ,后面的n行是节点的具体形式:"<<endl;

cout<<"n= ";

cin>>n;

p=(inform* )malloc( n*sizeof(inform) ); /*开辟的一个叶子结构体型的指针数组*/
inform *p1; p1=p;

for(int i=0; i<n; i++)

{
cin>>(p+i)->data>>(p+i)->l>>(p+i)->r;
if((p+i)->l != -1) (p+i)->signl=1; /*用signl signr 的0,1标示输入的信息中是否有左或右孩子*/
else (p+i)->signl= 0;
if((p+i)->r !=-1) (p+i)->signr=1;
else (p+i)->signr= 0;
}

/*--------------------------------------------------------------------------------------------*/
a[0]= p->data;

judge ( p1 ); /*用递归算法将输入数据信息转为线性字符串*/

cout<<endl<<"输出转换的线性字符串: "<<endl;

cout<<a<<endl<<endl;
/*------------------------------------------遍历-----------------------------------*/
leafnode* T;

T= creatree();

/*先续遍历二叉树*/
cout<<"先序遍历二叉树: "<<endl;
preorder( T );

cout<<endl<<"中序遍历二叉树: "<<endl;
inorder ( T );

cout<<endl<<"后序遍历二叉树: "<<endl;
postorder( T );
cout<<endl<<endl;

}

/*------------------------------------------函数定义-------------------------------*/

void judge( inform* ps ) /*用函数的递归来将输入的信息转化为线性的数组*/
{
inform* b;

if (ps->signl==0)
{
a[k]='@';
k++;
}
else
{
b = p+(ps->l);
a[k] = b->data;
k++;
judge(b);
}

if ((ps->signr) == 0)
{
a[k]='@';
k++;
}
else
{
b = p+(ps->r );
a[k] = b->data;
k++;
judge(b);
}

}

leafnode* creatree() /*建立二叉树函数*/
{
char ch;

leafnode *t;

ch= a[s];
s++;

if(ch=='@')
{
t=NULL;
}
else
{
t=(leafnode* )malloc(sizeof(leafnode));
t->leaf=ch;
t->lchild=creatree();
t->rchild=creatree();
}
return t;

}

/*先序遍历的递归函数*/
void preorder (leafnode* T)
{
if(T)
{
cout<<T->leaf;
preorder(T->lchild);
preorder(T->rchild);
}
}
/*中序遍历的递归函数*/
void inorder (leafnode* T)
{
if(T)
{
inorder(T->lchild);
cout<<T->leaf;
inorder(T->rchild);
}
}
/*后序遍历的递归函数*/
void postorder (leafnode* T)
{
if(T)
{
postorder(T->lchild);
postorder(T->rchild);
cout<<T->leaf;
}
}

热心网友 时间:2023-11-01 23:11

完全二叉树有1000个结点,度为1的节点个数可能是0或1,若为0,则该题无解,所以显然不能为0了,若为1,则度为2的结点个数为499个,度为1的节点数为1,度为0的节点为500

热心网友 时间:2023-11-01 23:12

楼主哥哥,看下面,你把这个函数看成一个f(x)
当x=NULL f(x)=0;
当x左右子树为空 f(x)=1;
其他 f(x)=f(bt->lchild)+f(bt-rchild)
-----------------------------------------------------------------------
int Count(BTreeNode *BT)
{
int l,r;
if(BT==NULL) return 0;
else if(BT->Lchild==NULL&&BT->Rchild==NULL) return 1;
else
{
l=Count(BT->Lchild);
r=Count(BT->Rchild);
return (l+r);
}
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我处一去成都九寨沟牟泥沟乐山娥眉,穿什么衣服,那的景色美吗现在 女人叫老公已过时 现在流行这三种称呼 老婆如何称呼老公? cpa在银行系统有什么用 注会能从业什么工作吗 有注会证找什么工作 直接写出下面各题的得数. 65÷5= 430+80= 400÷8= 13×7= 360÷40=... 直接写出下面各题的得数.(后四题估算)7×12=220×4=50×40=27×30=7... 直接写出下面各题的得数.72÷24=16×5=54÷3=404×28≈360÷40=560÷4... 明日方舟 明日方舟引航者试炼怎么玩? Win10系统安装过程中出现,将windows连接到你的组织,选哪个? 为什么每次第一个评论别人的抖音视频不是沙发? 什么是叶结点,举例说明 淘宝第一个评价怎么顶下去 *品和精神药品运输管理办法的*品和精神药品运输管理办法 为什么第一条评论叫做沙发? C语言列出叶节点的一道实验题老说格式错误,但是格式自己试过了没错,后面是没空格的 精神病类药物过期能否服用 评论里刷发第一第二是什么意思? 为什么第一个评论的人被叫做沙发? 关于二类精神药品经营申报资料,向药品监督管理部门报送经营信息的操作规程,急用吖! 为什么第一个评论的人叫做沙发? 第二类精神药品保存期限? 一类精神药品怎么报损 第一个评论的人叫什么? 第二个评论的人叫什么? 第三个评论的人叫什么? 第四个评论的人叫什么? …_百度问一问 win10怎么组织kb5007186更新 过期药品怎样处理了? 由组织管理电脑是什么意思安装win10精简版出现 麻醉药品和精神药品的质量管理制度有哪些 win10电脑激活显示“已经通过使用你所在组织的激活服务激活windows”我用激活工具激活的 第一条评论应该怎样搞笑的回复? 申报信息系统项目管理师高级职称条件是什么?考过就是吗? 使用二类精神药算吸毒吗 你发朋友圈女人都是第一评论 计算机网络的二叉线索查找路由表的怎么看到达了叶节点 抖音评论区点赞第一叫什么 评论说第一怎么回复 二叉树有叶子结点,有度为1的结点,总结点怎么算?有公式嘛? 高级信息系统项目管理师和中级系统集成项目管理师 的报考条件 是什么? 当一个男生第一次评论你发的朋友圈是什么情况 Win10系统安装过程中出现,将windows连接到你的组织,点击哪个? 具有10个叶子结点的二叉树中有()个度为2的结点 微博第一个评论的为什么叫沙发 叶结鱼的介绍 信息系统项目管理师考试报名有什么资历要求?是否必须通过中级资格考试... 别人评论作品第一应该怎么回答? 高分求数据结构(C语言)高手做题!(200悬赏+50追加+20采纳=270分)_百度... 第一个评论的人英语怎么写 pascal中二叉树遍历 最优二叉树算法的编码中的应用