北京化工大学数据结构2022/10/27作业 题解
目录
问题 A: 二叉树的性质
问题 B: 二叉树的节点
问题 C: 满二叉树
问题 D: 完全二叉树的节点序号
-----------------------------------分割线------------------------------------------
问题 E: 二叉树的深度
问题 F: 数据结构作业04 -- 二叉树的输入
递归版
迭代版
问题 G: 给定前序遍历序手动构造二叉树-附加代码模式
问题 A: 二叉树的性质
答案非常简单就是输出n-1
但怎么证的呢?
我们不妨先论证一下总的度数和节点数的关系(这里的度指的是子节点数)
最开始我们的树只有一个根节点,而每派生出一个“度”,也就派生出了一个子节点
所以在这之后派生出的总度数量是等于所以子节点数量的
在加上根节点,也就得到了下面式子
节点总数=总度数+1
而左边节点度数可以写成 度为0的节点+度为1的节点+度为2的节点
右边可以写成 2*度为2的节点+1*度为1的节点+1
上式即为 度为0的节点+度为1的节点+度为2的节点= 2*度为2的节点+1*度为1的节点+1
两边一合并
度为2的节点+1=度为0的节点
也就证出来了
代码如下
cpp
int n;cin>>n;cout<<n-1<<endl;
python
n = int(input())
print(n-1)
问题 B: 二叉树的节点
这个应该不难想
二叉树的深度取决于最深的节点
最少节点我们只要一条路走到黑或者之字形走,如下图
这样最少节点数就等于深度
(题外话)
也就是说基于二叉树实现的搜索树最坏情况会退化为链表,而在单链表中查找和指定删除都为
边缘性能很差,这也就有了之后AVL,红黑树的故事
最多也很简单
只需要每层都满节点就好了
也就是
也就等于
cpp代码
int n;cin>>n;cout<<n<<' '<<pow(2,n)-1;
python代码
h=int(input())
ma = pow(2,h)-1
print(h,ma)
问题 C: 满二叉树
这道题同上了
满二叉树就是节点最多的时候
判断即可
cpp代码
int h,n;while(cin>>h>>n){if (n==pow(2,h)-1) cout<<"YES"<<endl;else cout<<"NO"<<endl;}
python代码
while 1:h,n=map(int,input().split())if pow(2,h)-1 == n:print('YES')else:print('NO')
问题 D: 完全二叉树的节点序号
我们用数组在存这种二叉堆结构有一个默认的方式,例如存线段树
左儿子等于父亲*2,右儿子等于父亲*2+1
例如存一棵value值如下图的7个节点的满二叉树
在数组中为
这样a[2]的儿子就是left:a[2*2],right:a[2*2+1]
也就是a[4]和a[5]
这题下标是从0开始,加个偏移量即可
代码如下
int n;while(cin>>n){if(n==0) cout<<"-1 1 2\n";else cout<<(n-1)/2<<" "<<2*n+1<<" "<<2*n+2<<'\n';}
-----------------------------------分割线------------------------------------------
以下二叉树的前中后序遍历
思路详解见(2条消息) (数据结构)如何手搓一棵二叉树?_lxrrrrrrrr的博客-CSDN博客
我们只要实现一个简单的就好
问题 E: 二叉树的深度
先建树,在找深度
建树:他提供带虚节点前序遍历,前序遍历是 根左右
所以我们按照根左右的方式重构树即可,遇到虚节点时结束,代表当前点无节点
找深度时每个节点的dep=max(dep[left],dep[right])+1
从底层节点递归上来即可
代码如下
#include<bits/stdc++.h>
using namespace std;
int ind;
class node{
public:char data;int dep;node* left;node* right;
};
class bintree{
public:node* __root;void createtree(node* &T,string s);int updatadep(node *T);
};
void bintree::createtree(node* &T,string s){char data=s[ind];ind++;if(data=='#'){T=nullptr;}else{T=new node;T->data=data;createtree(T->left,s);createtree(T->right,s);}
}
int bintree::updatadep(node *T){int L,R;if(T!=NULL){L=updatadep(T->left);R=updatadep(T->right); T->dep=L>R?L+1:R+1;return T->dep;}return 0;
}
signed main(){bintree tree;string str;int T;cin>>T;while(T--){cin>>str;bool fl=false;for(auto t:str){if(t!='#'){fl=true;break;}}if(!fl){cout<<"0\n";continue;}ind=0;tree.createtree(tree.__root,str);cout<<tree.updatadep(tree.__root)<<'\n';}
}
问题 F: 数据结构作业04 -- 二叉树的输入
建树前一道题已经建过了
这里主要说下中后序遍历
中序遍历我给出了两种方式
递归版和迭代版
递归版
中序遍历是按照 左--根--右 的方式遍历
递归版写起来特别简单
这样在回溯的时候就会按照中序遍历遍历这棵树
前后序遍历的递归版也就是调换一下顺序
迭代版
同样是从根节点开始,不断地沿着左子树向下走。不同的是,这里向下行进的过程中不能访问当前结点,只有等到当前结点的左子树完成访问时,才能轮到当前结点,因此想到引入一个栈来实现延迟缓冲的功能。走到最左侧的第一个没有左子树的叶子结点时,没有左子树也相当于已经完成了左子树的访问,于是随后便访问当前结点x,然后转入到x的右子树。
当x的右子树完成访问时,即标志着以x为根的子树访问完毕,随机访问x的父亲结点,然后访问x的父亲的右子结点。x的右兄弟结点访问完毕时,即标志着以x的父亲的根的子树访问完毕,随即访问x父亲的父亲,然后是x父亲的父亲的父亲...
后序遍历的详解去看(2条消息) (数据结构)如何手搓一棵二叉树?_lxrrrrrrrr的博客-CSDN博客
goAlongLeft函数的作用是对于每一个节点,一直向左走,这一条左链都压入栈
具体实现:对于每一个节点,先一直向左走,将他的所有左儿子都压入栈,之后每一个左儿子
按顺序出栈,遍历此节点,再遍历此节点的右节点,之后下一个左儿子出栈.....
代码如下:
#include<bits/stdc++.h>
using namespace std;
int ind;
class node{
public:char data;node* left;node* right;
};class bintree{
public:node* __root;void createtree(node* &T,string s);void visit(node* T){if(T->data!='#') cout<<T->data;}void inorder(node* T);void postorder(node* T);void levelorder(node* T);void goalongleft(stack<node*> &S,node* now);void inorder_it(node* T);
};void bintree::createtree(node* &T,string s){char data=s[ind];ind++;if(data=='#'){T=nullptr;}else{T=new node;T->data=data;createtree(T->left,s);createtree(T->right,s);}
}void bintree::inorder(node* T){if(T!=nullptr){inorder(T->left);visit(T);inorder(T->right);}
}void bintree::goalongleft(stack<node*> &S,node* now){node* curr=now;while(curr!=nullptr){S.push(curr);curr=curr->left;}
}void bintree::inorder_it(node* T){stack<node*> S;node* curr=T;while(1){goalongleft(S,curr);if(S.empty()) break;curr=S.top();S.pop();visit(curr);curr=curr->right;}
}void bintree::postorder(node* T){if(T!=nullptr){postorder(T->left);postorder(T->right);visit(T);}
}void bintree::levelorder(node* T){queue<node*> q;q.push(this->__root);while(!q.empty()){node* top=q.front();q.pop();visit(top);if(top->left) q.push(top->left);if(top->right) q.push(top->right);}
}signed main(){bintree tree;string str;while(cin>>str){bool fl=false;for(auto t:str){if(t!='#'){fl=true;break;}}if(!fl){cout<<"\n";continue;}ind=0;tree.createtree(tree.__root,str);tree.inorder(tree.__root);cout<<" ";// tree.inorder_it(tree.__root);// cout<<endl;tree.postorder(tree.__root);cout<<" ";tree.levelorder(tree.__root);cout<<'\n';}
}
问题 G: 给定前序遍历序手动构造二叉树-附加代码模式
随便编一个就行
using namespace std;struct BiNode
{string data;BiNode *lchild, *rchild;
};
typedef BiNode *BiTree;int InitBiTree(BiTree &T)
{T = NULL;return 0;
}
void ManuallyCreateTree(BiTree & T){T = new BiNode();T->data = "a";BiNode* n1 = new BiNode();n1->data = "b";BiNode* n2 = new BiNode();n2->data = "c";T->lchild = n1;T->rchild = n2;BiNode* p = new BiNode();p->data = "d";n1->lchild = p;BiNode* p1 = new BiNode();p1->data = "e";n1->rchild = NULL;n2->lchild = p1;BiNode* p2 = new BiNode();p2->data = "f";n2->rchild = p2;
}
C语言毕竟不是面向过程的语言,用C写这种数据结构简直坐牢
毕竟高内聚低耦合的cpp写出来很养眼
北京化工大学数据结构2022/10/27作业 题解相关推荐
- 2022.10.27
#include<stdio.h> int main(){int QQ_num;//定义一个名为QQ_num的变量存放QQ号char pet_name[10];//定义一个名为pet_na ...
- web前端开发笔记21~45 2022/10/27
表格表单以及css基础 一.列表嵌套 二.表格标签 1.表格标签使用 2.表格标签属性 三.表单标签 1.input属性(在form标签下) 2.表单其他属性(在form标签下) 1.`<tex ...
- 2022.10.27 英语背诵
culminate 使达高潮,结束 ~ in 达到顶点 legend 传说,传奇 origin 起源,血统 technique 技术,技能,行家手法 occurrence 发生,出现 liquor 酒 ...
- 一步一个脚印学C/2022/7/27
- English Learning - Day21 作业打卡 2022.12.27 周二
English Learning - Day21 作业打卡 2022.12.27 周二 引言 一.给出如下短语的汉语释义 1. vanished youth 2. faded flowers 3. o ...
- BUAA数据结构第五次作业2023
文章目录 BUAA数据结构第五次作业2023 1. 树叶节点遍历(树-基础题) 题目 问题描述 输入形式 输出形式 样例输入 样例输出 样例说明 评分标准 问题分析 具体处理过程 完整代码 2. 词频 ...
- 北京化工大学计算机科专业,北京化工大学专业介绍及排名 哪些专业最好
北京化工大学专业介绍及排名 哪些专业最好2017-11-15 14:03:13文/李男 在选择专业时,北京化工大学有哪些专业?哪些专业最好?都是学生们十分关心的问题,下面小编整理了北京化工大学专业相关 ...
- 重学数据结构——快速排序,二分法查找
每次提起快排,内心中都有点隐隐作痛. 当时腾讯的那个面试官让我写快排的前两遍排序结果,结果,我当时居然没写上来-- 这个,就是所谓的关键时刻掉链子吧,这么经典的快排都不会,真是丢死人了-- 今天在实验 ...
- 2022.10.9-10.16 AI行业周刊(第119期):相信坚持的力量
篇章一:个人咨询 周六晚上的时候,接了一个粉丝的付费咨询,他硕士毕业将近两年,想基于目前的工作状态,咨询未来短期和长期的规划和想法. 他提到一个疑惑,因为他们公司算法工程师有将近30个人,除了本身的工 ...
最新文章
- Linux 进程管理工具
- 太赞了!2020年全网最新Java面试题(附答案)免费下载!超全!!
- 转自他人——————TLE之前,没有一个节点叫失败!!!
- Google C++ Coding Style:右值引用(Rvalue Reference)
- java新入手的三十个基本概念
- android源码出现的@字符代表什么意思
- Mybatis中的@SelectKey注解
- vue3.0中使用echarts
- bindZip下载地址
- 计算机多人远程桌面连接,配置网络:实现多个远程桌面连接
- 计算机win10无法打开小键盘,在win10中,数字小键盘开机不启动的原因是什么?...
- 使用pdf.js把PDF文件转图片
- 叠氮试剂79598-53-1,6-Azidohexanoic Acid,6-叠氮基己酸,末端羧酸可与伯胺基反应
- Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
- html中的input文本框禁止输入问题
- Echarts地图 绘制自定义区域 - geojson.io使用方法
- Git修改用户名和邮箱
- 源发行版本 17 需要目标发行版 17
- 常用半导体器件 绪论
- 宽带自动拨号(无路由器)