树与二叉树(李春葆课后习题代码题)

1:假设二叉树中每个结点的值为单个字符,设计一个算法将一棵以二叉链方式存储的二叉树 b 转换成对应的顺序存储结构 a

代码:

void Ctree(BTNode *b,SqBTree a,int i){if(b!=NULL){a[i]=b->data;Ctree(b->lchild,a,2*i);Ctree(b->rchild,a,2*i+1);}else a[i]='#';
} 

2: 假设二叉树中每个结点值为单个字符,采用顺序存储结构存储。设计一个算法, 求二叉树 t 中的叶子结点个数。

思想:用 i 遍历所有的结点,当 i 大于等于 MaxSize 时,返回 0。当 t[i]是空结点时返回 0; 当 t[i]是非空结点时,若它为叶子结点,num 1;否则递归调用 num1=LeftNode(t2*i) ,求出左子树的叶子结点个数 num1,再递归调用 num2=LeftNode(t2*i+1)求出右子树的叶 子结点个数 num2,置 num+=num1+num2。最后返回 num

代码:

int LeafNode(SqBTree t,int i){//i初始值为1int numl,numr,num=0;if(i<MaxSize){if(t[i]!='#'){if(t[2i]=='#'&&t[2i+1]=='#'){num++;}else{numl=LeafNode(t,2*i);numr=LeafNode(t,2*i+1);num=numl+numr;}return num;}return 0;}else{return 0;} 
}

3:假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法 计算一棵给定二叉树 b 中的所有单分支结点个数。

代码:

int isonebranch(BTNode *b){int numl,numr,n;if(b==NULL){return 0;}else if((b->lchild==NULL&&b->rchild!=null)||(b->lchild!=NULL&&b->rchild==NULL)){n=1;}else{n=0;}numl=isonebranch(b,b->lchild);numr=isonebranch(b,b->rchild);return    (numl+numr+n); 
}

4:假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法求二叉树 b 中最小值的结点值。

代码:

void FindMinNode(BTNode *b,char &min){if(b->data<min){min=b->data;}else{FindMinNode(b,b->lchild);FindMinNode(b,b->rchild);}
}
void MinNode(BTNode *b){if(b!=NULL){char min=b->data;FindMinNode(b,min);printf("Min=&c\n",min);}
}

5: 假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法将二叉链 b1 复制到二叉链 b2 中。

思想:当 b1 为空时,置 b2 为空树。当 b1 不为空时,建立 b2 结点(b2 为根结点),置 b2->data=b1->data;递归调用 Copy(b1->lchildb2->lchild),由 b1 的左子树建立 b2 的左 子树;递归调用 Copy(b1->rchildb2->rchild),由 b1 的右子树建立 b2 的右子树。

代码:

void copy(BTNode *b1,BTNode *b2){if(b1==NULL){b2=NULL;}else{b2=(BTNode*)malloc(sizeof(BTNode));b2->data=b1->data;copy(b1->lchild,b2->lchild);copy(b1->rchild,b2->rchild);}
}

6:假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法, 求二叉树 b 中第 k 层上叶子结点个数。

思想:采用先序遍历方法,当 b 为空时返回 0。置 num 0。若 b 不为空,当前结点的 层次为 k,并且 b 为叶子结点,则 num 1,递归调用 num1=LevelkCount(b->lchildkh+1) 求出左子树中第 k 层的结点个数 num1,递归调用 num2=LevelkCount(b->rchildkh+1)求出右子树中第 k 层的结点个数 num2,置 num+=num1+num2,最后返回 num

代码:

int LevelKCount(BTNode *b,int k,int h){int numl,numr,n=0;if(b!=NULL){if(h==k&&b->lchild==NULL&&b->rchild==NULL){num++;}else{numl=LeveKCount(b->lchild,k,h+1);numr=LeveKCount(b->rchild,k,h+1);num += numl+numr;return num;}}return 0;
}int Levelkleaf(BTNode *b,int k){return Leve;KCount(b,k,1);
}

 7:假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法, 判断值为 x 的结点与值为 y 的结点是否互为兄弟,假设这样的结点值是唯一的。

思想:采用先序遍历方法,当 b 为空时直接返回 false;否则,若当前结点 b 是双分支结

点,且有两个互为兄弟的结点 xy,则返回 true;否则,递归调用 flag=Brother(b->lchild

xy),求出 xy 在左子树中是否互为兄弟,若 flag true,则返回 true;否则递归调用

Brother(b->rchildxy),求出 xy 在右子树中是否互为兄弟,并返回其结果。

代码:

bool Brother(BTNode *b,char x,char y){bool flag;if(b==NULL){return false;}else{if(b->lchid!=NULL && b->rchild!=NULL){if((b->lchild->data==n&&b->rchild->data==y)||(b->lchild->data==y&&b->rchild==x)){return true;}flag=Brother(b->lchild,x,y);if(flag==true){return true;}else{return Brother(b->rchild,x,y);}}}
}

8:

假设二叉树中每个结点值为单个字符,采用二叉链存储结构存储。设计一个算法,采用先序遍历方法求二叉树 b 中值为 x 的结点的子孙,假设值为 x 的结点是唯一的。

思想:设计 Output(p)算法输出以 p 为根结点的所有结点。首先在二叉树 b 中查找值为 x

的结点,当前 b 结点是这样的结点,调用 Output(b->lchild)输出其左子树中所有结点,调用

Output(b->rchild)输出其右子树中所有结点,并返回;否则,递归调用 Child(b->lchildx)

在左子树中查找值为 x 的结点,递归调用 Child(b->rchildx)在右子树中查找值为 x 的结点。

代码:

void Output(BTNode *p){if(p!=NULL){printf("%c",p->data);Output(p->lchild);Output(p->rchild);}
}
void Child(BTNode *b,char x){if(b!=NULL){if(b->data==x){if(b->lchild!=NULL){Output(b->lchild);}if(b->rchild!=NULL){Output(b->rchild);return;}}Child(b->lchild,x);Child(b->rchild,x);}
}

9:假设二叉树采用二叉链存储结构,设计一个算法把二叉树 b 的左、右子树进行交 换。要求不破坏原二叉树。

代码:
//方法一
void Swap(BTNode *b,BTNode *&b1){if(b==NULL){b1=NULL;}else{b1=(BTNode *)malloc(sizeof(BTNode));b1->data=b->data;Swap(b->lchild,b1->rchild);Swap(b->rchild,b1->lchild);}
}//方法二:力扣226
struct TreeNode* invertTree(struct TreeNode* root) {if(root==NULL){return root;}struct TreeNode* temp=NULL;temp=root->left;root->left=root->right;root->right=temp;if(root->left != NULL){invertTree(root->left);}if(root->right != NULL){invertTree(root->right);}return root;}

10:假设二叉树采用二叉链存储结构,设计一个算法判断一棵二叉树 b 的左、右子树是否同构。

代码:

bool Symm(BTNode *b1,BTNode *b2){if(b1==NULL&&b2==NULL){return true; }else if(b1==NULL || b2==NULL){return false;}else{return (Symm(b1->lchild,b2->lchild)&&Symm(b1->rchild,b2->rchild));}
}bool Symmtree(BTNode *b){if(b==NULL){return true;}else{return Symm(b->lchild,rchild);}
}

11:假设二叉树以二叉链存储,设计一个算法,判断一棵二叉树 b 是否为完全二叉树。

思想:根据完全二叉树的定义,对完全二叉树按照从上到下、从左到右的次序遍历(层 次遍历)应该满足:

1)某结点没有左孩子,则一定无右孩子。

2)若某结点缺左或右孩子(一旦出现这种情况,置 bj=false),则其所有后继一定

无孩子。

若不满足上述任何一条,均不为完全二叉树(cm=true 表示是完全二叉树,cm=false

示不是完全二叉树)。

代码:

bool CompBTNode(BTNode *b){BTNode *Qu[MAXsize],*p;int front=0,rear=0;//环形队列的队头和队尾指针 bool cm=true;//为真,则表示二叉树 bool bj=true;//为真,表示到目前为止所有结点均有左右孩子if(b==NULL) return true;//空树为完全二叉树 rear++;Q[rear]=b;//根节点进队 while(front!=rear){//队列不为空 front=(front+1)%MaxSize;p=Qu[front];//p结点出队 if(p->lchild==NULL){//p结点没有左孩子 bj=false;if(p->rchild!=NULL){//没有左孩子还是有右孩子 cm=false;}}else{if(bj==false) cm=false;//bj为假,而p还有左孩子时 rear=(rear+1)%MaxSize;Qu[rear]=p->lchild;//左孩子进队 if(rchild==NULL){bj=fase;//没有右孩子 } else{rear=(rear+1)%MaxSize;//右孩子进队 Qu[rear]=p->rchild;}}return cm;} 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/468964.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Matlab 疲劳驾驶检测

Matlab 疲劳驾驶检测 课题介绍 该课题为基于眼部和嘴部的疲劳驾驶检测。带有一个人机交互界面GUI&#xff0c;通过输入视频&#xff0c;分帧&#xff0c;定位眼睛和嘴巴&#xff0c;通过眼睛和嘴巴的张合度&#xff0c;来判别是否疲劳。 二、操作步骤 第一步&#xff1a;最…

11.11 代码块

一 java 1.代码块 1&#xff09; 理解 使用构造器时&#xff1a;先默认 调用代码块内容 再调用 构造器内容【代码块 > 构造器】 1.1 细节 1&#xff09;静态代码块 只能加载一次 2&#xff09;先调用父类代码块 再子类代码块 3&#xff09;静态代码块是随着类加载而执行…

在gitlab,把新分支替换成master分支

1、备份master分支&#xff0c;可以打tag 2、删除master分支 正常情况下&#xff0c;master分支不允许删除&#xff0c;需要做两个操作才能删除 a、变更项目默认分支为非master分支&#xff0c;可以先随便选择 b、取消master为非保护分支 操作了上述两步&#xff0c;就可以删…

在使用element中的抽屉<el-drawer>页签<el-tabs/>组合时,echarts图表宽度显示异常问题

类似这种情况&#xff0c;宽度异常 原因&#xff1a;在展示出抽屉时&#xff0c;图表的组件一件初始化了&#xff0c;导致他的宽度提前设定好了&#xff08;我默认的style"width: 100%; height: 300px;"&#xff09;&#xff0c;我得解决方法有2个&#xff1a; 1、第…

《大模型应用开发极简入门》笔记

推荐序 可略过不看。 初识GPT-4和ChatGPT LLM概述 NLP的目标是让计算机能够处理自然语言文本&#xff0c;涉及诸多任务&#xff1a; 文本分类&#xff1a;将输入文本归为预定义的类别。自动翻译&#xff1a;将文本从一种语言自动翻译成另一种语言&#xff0c;包括程序语言。…

Unicode字符集(万国码)

1.三种编码方式&#xff1a; UTF-16&#xff1a;16个bit位&#xff08;2个字节&#xff09;存储 UTF-32&#xff1a;32个bit位&#xff08;4个字节&#xff09;存储 UTF-8&#xff1a;可变长度字符编码。1-4个字节存储&#xff0c;只需记住&#xff1a;英文字母1个字节表示&…

支持 Win10 的网络环境模拟(丢包,延迟,带宽)

升级 Windows 10 以后&#xff0c;原来各种网络模拟软件都挂掉了&#xff0c;目前能用的就是只有 clumsy&#xff1a; 唯一问题是不支持模拟带宽&#xff0c;那么平时要模拟一些糟糕的网络情况的话&#xff0c;是不太方便的&#xff0c;而开虚拟机用 Linux tc 或者设置个远程 l…

【Homework】【5】Learning resources for DQ Robotics in MATLAB

Lesson 5 代码-TwoDofPlanarRobot.m 表示一个 2 自由度平面机器人。该类包含构造函数、计算正向运动学模型的函数、计算平移雅可比矩阵的函数&#xff0c;以及在二维空间中绘制机器人的函数。 classdef TwoDofPlanarRobot%TwoDofPlanarRobot - 表示一个 2 自由度平面机器人类…

在模方置平建筑失败的原因是什么?

在模方置平建筑失败的原因是什么&#xff1f; 可能是obj拓扑不连续&#xff0c;可以在网格大师使用osgb转obj功能&#xff0c;选择拓扑或者重建。 网格大师是一款能够解决实景三维模型空间参考、原点、瓦块大小不统一&#xff0c;重叠区域处理问题的工具“百宝箱”&#xff0c…

【大咖云集 | IEEE计算智能学会广州分会支持】第四届信息技术与当代体育国际学术会议(TCS 2024,12月13-15日)

第四届信息技术与当代体育国际学术会议&#xff08;TCS 2024&#xff09; 2024 4th International Conference on Information Technology and Contemporary Sports 重要信息 会议官网&#xff1a;www.icitcs.net&#xff08;会议关键词&#xff1a;TCS 2024&#xff09; 202…

常用机器人算法原理介绍

一、引言 随着科技的不断发展&#xff0c;机器人技术在各个领域得到了广泛应用。机器人算法是机器人实现各种功能的核心&#xff0c;它决定了机器人的行为和性能。本文将介绍几种常用的机器人算法原理&#xff0c;包括路径规划算法、定位算法和运动控制算法。 二、路径规划算法…

Cynet:全方位一体化安全防护工具

前言 1999年&#xff0c;布鲁斯施奈尔曾说过&#xff1a;“复杂性是安全最大的敌人。”彼时还是19年前&#xff0c;而现在&#xff0c;网络安全已然变得更加繁杂。 近日我在网上冲浪过程中发现了这么一个平台性质的软件&#xff0c;看似具有相当强的防护能力。 根据Cynet的描…

dolphin 配置data 从文件导入hive 实践(一)

datax 支持多种数据源的相互读写&#xff0c;作为开源软件&#xff0c;提供了离线采集功能&#xff0c;方便系统开发&#xff0c;过程中遇到诸多配置&#xff0c;需要开发者自己探索&#xff0c;免费同样有成本 配置模板 {"setting": {},"job": {"s…

Redis如何保证数据不丢失(可靠性)

本文主要以学习为主&#xff0c;详细参考&#xff1a;微信公众平台 Redis 保证数据不丢失的主要手段有两个&#xff1a; 持久化 多机部署 我们分别来看它们两的具体实现细节。 1.Redis 持久化 持久化是指将数据从内存中存储到持久化存储介质中&#xff08;如硬盘&#xf…

Linux数据管理初探

Linux数据管理初探 导语内存管理内存分配内存错用和处理 文件锁定锁文件/区域锁读写和竞争锁命令和死锁 dbm数据库例程dbm访问函数其他dbm函数 总结参考文献 导语 Linux为应用程序提供简洁的视图用来反映可直接寻址的内存空间&#xff08;但实际上可能是内存外存&#xff09;&…

Python中4个高效小技巧

分享 4 个省时的 Python 技巧&#xff0c;可以节省 10~20% 的 Python 执行时间。 包含编程资料、学习路线图、源代码、软件安装包等&#xff01;【[点击这里]】&#xff01; 反转列表 Python 中通常有两种反转列表的方法&#xff1a;切片或 reverse() 函数调用。这两种方法都…

【黑马Redis原理篇】Redis数据结构

视频来源&#xff1a;原理篇[2,15] 文章目录 1.动态字符串SDS1.1 内部结构&#xff1a; 2.IntSet3.Dict3.1 dict的内部结构3.2 dict的扩容 4.ziplist压缩列表5.QuickList6.SkipList跳表7.RedisObject对象8.Redis的五种数据结构8.1 String8.2 List8.3 Set8.4 Zset 有序集合8.5 …

WPF之iconfont(字体图标)使用

1&#xff0c;前文&#xff1a; WPF的Xaml是与前端的Html有着高度相似性的标记语言&#xff0c;所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标&#xff0c;从而有效的减少开发工作度。 2&#xff0c;下载字体图标&#xff1a; 登录阿里图标库网iconfont-阿里巴巴矢量…

内网部署web项目,外网访问不了?只有局域网能访问!怎样解决?

相关技术 要实现“内网部署&#xff0c;外网访问”&#xff0c;可以使用内网穿透、VPN技术、DMZ主机、端口映射等方法。以下是对这些方法的详细解释&#xff1a; 一、内网穿透 内网穿透是一种技术&#xff0c;它通过将内网设备映射到公网上的方式&#xff0c;实现外网访问内…

Android MVVM demo(使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成)

使用DataBinding&#xff0c;LiveData&#xff0c;Fresco&#xff0c;RecyclerView&#xff0c;Room&#xff0c;ViewModel 完成 玩Android 开放API-玩Android - wanandroid.com 接口使用的是下面的两个&#xff1a; https://www.wanandroid.com/banner/jsonhttps://www.wan…