首页

文章

数据结构中,怎样以二叉链表为存储结构,分别写出求二叉树结点总数及叶子总数的算法?

发布网友 发布时间:2022-03-22 15:44

我来回答

5个回答

热心网友 时间:2022-03-22 17:13

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

#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;
}
}

热心网友 时间:2022-03-22 18:31

//求叶子节点数
#include<iostream>
using namespace std;
int n=0;//全局变量求叶子总数
template <class T>
struct BiNode
{
T data;
BiNode<T>*lchild,*rchild;
};
template <class T>
class BiTree
{
public:
BiTree(){root=Creat(root);}
int PreOrder(){return PreOrder(root);}
private:
BiNode<T>*root;
int count;
BiNode<T>*Creat(BiNode<T>*bt);
int PreOrder(BiNode<T>*bt);
};
template <class T>
int BiTree<T>::PreOrder(BiNode<T>*bt)
{
if(bt==NULL)return 0;
else{
PreOrder(bt->lchild);
n++;
PreOrder(bt->rchild);
}
return n;
}
template<class T>
BiNode<T>*BiTree<T>::Creat(BiNode<T>*bt)
{ char ch;
cin>>ch;
if(ch=='#')bt=NULL;
else{
bt=new BiNode<T>;bt->data=ch;
bt->lchild=Creat(bt->lchild);
bt->rchild=Creat(bt->rchild);
}
return bt;
}
int main()
{ int t;
BiTree<char> Bt;
t=Bt.PreOrder();
if(t==0)cout<<"NULL"<<endl;
else cout<<t<<endl;
return 0;
}
//求二叉树结点总数
#include<iostream>
using namespace std;
int n=0;
template <class T>
struct BiNode
{
T data;
BiNode<T>*lchild,*rchild;
};
template <class T>
class BiTree
{
public:
BiTree(){root=Creat(root);}
int PreOrder(){return PreOrder(root);}
private:
BiNode<T>*root;
int count;
BiNode<T>*Creat(BiNode<T>*bt);
int PreOrder(BiNode<T>*bt);
};
template <class T>
int BiTree<T>::PreOrder(BiNode<T>*bt)
{
if(bt==NULL)return 0;
else{
PreOrder(bt->lchild);
n++;
PreOrder(bt->rchild);
}
return n;
}
template<class T>
BiNode<T>*BiTree<T>::Creat(BiNode<T>*bt)
{ char ch;
cin>>ch;
if(ch=='#')bt=NULL;
else{
bt=new BiNode<T>;bt->data=ch;
bt->lchild=Creat(bt->lchild);
bt->rchild=Creat(bt->rchild);
}
return bt;
}
int main()
{ int t;
BiTree<char> Bt;
t=Bt.PreOrder();
if(t==0)cout<<"NULL";
else cout<<t;
return 0;
}

热心网友 时间:2022-03-22 20:06

int CountNode (BTNode *t) //节点总数
{
int num;
if (t == NULL)
num = 0;
else
num = 1 + CountNode (t->lch) + CountNode (t->rch);
return (num);
}

void CountLeaf (BTNode *t) //叶子节点总数
{
if (t != NULL)
{
if (t->lch == NULL && t->rch == NULL)
count ++; // 全局变量
CountLeaf (t->lch);
CountLeaf (t->rch);
}
}

热心网友 时间:2022-03-22 21:57

先设计了一个结构体形式int n; cout<<"请输入二叉树内容:第一行为节点总数n ,后面的n行是节点,谢谢

热心网友 时间:2022-03-23 02:30

int jiedian(BTNode *b)//节点总数
{
if(b)
return (jiedian(b->lchild)+jiedian(b->rchild)+1);
else
return 0;

}
int yezi(BTNode *b)//叶子总数
{
if(b->lchild==NULL && b->rchild==NULL)
return 1;
else
return (yezi(b->lchild)+yezi(b->rchild));
}
逆水寒手游庄园怎么邀请好友同住 逆水寒手游 逆水寒不同区可以一起组队吗? 逆水寒手游 逆水寒怎么进入好友世界? 逆水寒手游 逆水寒怎么去别人的庄园? 使用puppeteer实现将htmll转成pdf 内卷时代下的前端技术-使用JavaScript在浏览器中生成PDF文档 【译】将HTML转为PDF的几种实现方案 变形金刚08动画怎么样 变形金刚08动画的问题 变形金刚08动画日语版剧情介绍 高分!换显卡nvidia控制面板被我卸了,重新安装显卡驱动后没了nvidia控... 我的nvidia控制面板被卸载了 怎么找回啊 卸载后 这个画面看着很奇怪_百 ... 李卓彬工作简历 林少明工作简历 广东工业职业技术学院怎么样 郑德涛任职简历 唐新桂个人简历 土地入股的定义 ups快递客服电话24小时 贷款记录在征信保留几年? 安徽徽商城有限公司公司简介 安徽省徽商集团新能源股份有限公司基本情况 安徽省徽商集团有限公司经营理念 2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 网络诈骗定罪标准揭秘 “流水不争先”是什么意思? mc中钻石装备怎么做 为什么我的MC里的钻石块是这样的?我想要那种。是不是版本的问题?如果是... 带“偷儿”的诗句 “君不见巴丘古城如培塿”的出处是哪里 带“奈何”的诗句大全(229句) 里翁行()拼音版、注音及读音 带“不虑”的诗句 “鲁肃当年万人守”的出处是哪里 无尘防尘棚 进出口报关流程,越详细越好。谢谢大家指教。 双线桥不是看化合价升多少就标多少的吗?为什么CL2+2KI=2KCL+I2中I失... 出师表高锰酸钾有画面了吗 2021年幼儿园新学期致家长一封信 电脑屏幕一条黑线怎么办? 销售代理商销售代理商的特点 二叉树的存储结构是怎样的?有哪些类型的存储结构?对应的c语言描述是? 二叉排序树。用二叉链表作存储结构。(8 三叉链表与二叉链表储存结构比较,有何区别?有何优缺点? 二叉链表作存储结构 二叉树的二叉链表存储结构如何实现 以二叉链表为存储结构, 二叉链表是二叉树的存储结构吗 您好,我的电话被标记骚扰电话了,怎么取消 电话号码被标注骚扰电话怎么解除 怎样取消号码诈骗电话标记 手机被标注骚扰电话,怎么解除? 手机被标注骚扰电话怎么取消? 手机被标记骚扰电话怎么取消 怎么取消标记电话 我的手机号不知道为什么被标记成诈骗电话了,怎么取消掉? 我的号码被标记为广告推销,骚扰电话,怎么取消标记 手机号码被标注为骚扰电话了,怎么解除掉 二叉树总的节点数为n,为啥空指针个数为n+1 二叉树指针问题。。Bitree 是什么? CreateBiTree为什么用BiTree *T, 是什么意思? 利用二叉链表存储树,则根结点的右指针是? 为什么答案不是右孩子是空? 用顺序和二叉链表作存储结构 数据结构的两道题,以二叉链表为存储结构 设二叉排序树采用二叉链表存储结构 采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作 以二叉链表作为二叉树的储存结构,在具有n个结点的二叉链表中n(n>0),空链域的个数为() 若二叉树采用二叉链表存储结构,要交换其所有分支结点左、右子树的位置,利用( )遍历方法最合适。 分别写出线性表的链式存储结构、二叉树的二叉链表存储机构的类C语言描述 以二叉链表为存储结构,写出求二叉树高度和宽度的算法 以二叉链表作存储结构,带虚节点的先序遍历序列为输入,构造二叉链表。 网络安全需要学什么 学习网络安全需要什么基础 如何学习网络安全知识? 网络安全怎么学? 网络安全需要学习哪些知识? 学习网络安全要学哪些知识? 学网络安全的基本知识有哪些? 网络安全工程师需要学习的必备技术有哪些? 如何学习网络安全,应该从何学起 网络安全需要哪些基础知识? 网络安全学些什么?
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com