7-4 (小字辈) 7-5 (列出叶结点) 7-6 (顺序存储的二叉树的最近的公共祖先问题)
目录
7-4 小字辈
7-5 列出叶结点
7-6 顺序存储的二叉树的最近的公共祖先问题
总结:
7-4 小字辈
原题链接:题目详情 - 7-4 小字辈 (pintia.cn)
思路:
利用一维数组下标将树之间串联起来(类似于并查集的合并操作,实质上则不同)
代码:
#include<bits/stdc++.h>
using namespace std;const int N=1e5+10;
int fa[N],gen[N];
int n;
int max1;
priority_queue<int,vector<int>,greater<int> >res;int find(int x){if(fa[x]==-1)gen[x]=1;if(gen[x]==0)gen[x]=find(fa[x])+1;return gen[x];
}int main(){cin>>n;for(int i=1;i<=n;i++){cin>>fa[i];}for(int i=1;i<=n;i++){//find(i);max1=max(max1,find(i));}for(int i=1;i<=n;i++){if(gen[i]==max1)res.push(i);}//sort(res.begin(),res.end());cout<<max1<<endl;while(!res.empty()){if(res.size()!=1)cout<<res.top()<<' ';elsecout<<res.top();res.pop();}
}
(题目没有分左右子树,即认为重建起来是树而非二叉树)
7-5 列出叶结点
原题链接:题目详情 - 7-5 列出叶结点 (pintia.cn)
思路:
依据题意重建二叉树即可,然后记录叶子结点的位置排序即可
代码:
#include<bits/stdc++.h>
using namespace std;const int N=15;
int n;
bool vis[N];
int root=-1;
int cnt;struct Binode{int elem;int lchild,rchild;int h,loc;
}e[N];void dfs(int x,int u){e[x].h=u;e[x].loc=cnt++;if(e[x].lchild!=-1)dfs(e[x].lchild,u+1);if(e[x].rchild!=-1)dfs(e[x].rchild,u+1);
}bool cmp(Binode x,Binode y){if(x.h!=y.h)return x.h<y.h;elsereturn x.loc<y.loc;
}int main(){cin>>n;for(int i=0;i<n;i++){char a,b;cin>>a>>b;e[i].elem=i;if(a!='-'){e[i].lchild=a-'0';vis[a-'0']=true;}else{e[i].lchild=-1;}if(b!='-'){e[i].rchild=b-'0';vis[b-'0']=true;}else{e[i].rchild=-1;}}for(int i=0;i<n;i++){if(!vis[i])root=i;}dfs(root,1);sort(e,e+n,cmp);for(int i=0;i<n;i++){if(e[i].lchild==-1&&e[i].rchild==-1){cout<<e[i].elem;if(i!=n-1)cout<<' ';}}
}
(有明确的的左右子树,即创建结构体,重建二叉树即可)
7-6 顺序存储的二叉树的最近的公共祖先问题
原题链接:
题目详情 - 7-6 顺序存储的二叉树的最近的公共祖先问题 (pintia.cn)
思路:
首先明确子树与祖先的位置关系,即祖先等于子树位置除以2
代码:
#include<bits/stdc++.h>
using namespace std;const int N=1e3+10;
int n;
int len[N];int fun(int a,int b){if(a==b)return a;if(a>b)return fun(a/2,b);if(a<b)return fun(a,b/2);
}int main(){cin>>n;for(int i=1;i<=n;i++)cin>>len[i];int a,b;cin>>a>>b;if(len[a]==0)cout<<"ERROR: T["<<a<<"] is NULL";else if(len[b]==0)cout<<"ERROR: T["<<b<<"] is NULL";else{int c=fun(a,b);cout<<c<<' '<<len[c];}
}
总结:
对于树的问题而言,解决问题的首要问题是对于树的重建
重建而言,你可以选择用数组下标与值串联起来的方式,即类似于并查集合并的方式
也可以选择用结构体指针的方式重建,相对而言没有纯数组实现的方式运算速度快
7-4 (小字辈) 7-5 (列出叶结点) 7-6 (顺序存储的二叉树的最近的公共祖先问题)相关推荐
- 7-7 列出叶结点 (10 分)
7-7 列出叶结点 (10 分) 对于给定的二叉树,本题要求你按从上到下.从左到右的顺序输出其所有叶节点. 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数.树中的结点从 0 到 N ...
- 【两种解法】基础实验4-2.2 列出叶结点 (25 分)
立志用最少的代码做最高效的表达 对于给定的二叉树,本题要求你按从上到下.从左到右的顺序输出其所有叶节点. 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数.树中的结点从 0 到 N− ...
- 列出叶结点(PTA)
对于给定的二叉树,本题要求你按从上到下.从左到右的顺序输出其所有叶节点. 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数.树中的结点从 0 到 N−1 编号.随后 N 行,每行给出 ...
- 列出叶节点 python
7-10 列出叶结点 (10 分) 对于给定的二叉树,本题要求你按从上到下.从左到右的顺序输出其所有叶节点. 输入格式: 首先第一行给出一个正整数 N(≤10),为树中结点总数.树中的结点从 0 到 ...
- 有一个1亿结点的树,已知两个结点, 求它们的最低公共祖先!
对该问题,分为如下几种情形讨论: 情形一: 假如该树为二叉树,并且是二叉搜索树, 依据二叉搜索树是排过序的, 我们只需要从树的根结点开始,逐级往下,和两个输入的结点进行比较. 如果当前结点的值比两个结 ...
- 二叉树如何求两个叶节点的最近公共祖先--re
二叉搜索树原理: 二叉搜索树是排序过的 ,位于左子树的结点都比父结点小,位于右子树的结点都比父结点大,我们只需从根节点开始和两个输入的结点进行比较,如果当前节点的值比两个结点的值都大,那么最低的公共祖 ...
- 在一颗度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是( )
在一颗度为4的树T中,若有20个度为4的结点,10个度为3的结点,1个度为2的结点,10个度为1的结点,则树T的叶结点个数是( ) A. 41 B. 82 C. 113 D. 122 设树中度为i(i ...
- LeetCode 988. 从叶结点开始的最小字符串(DFS)
文章目录 1. 题目 2. 解题 1. 题目 给定一颗根结点为 root 的二叉树,树中的每一个结点都有一个从 0 到 25 的值,分别代表字母 'a' 到 'z':值 0 代表 'a',值 1 代表 ...
- 6-8 先序输出叶结点 (15 分)
** 6-8 先序输出叶结点 (15 分) ** 本题要求按照先序遍历的顺序输出给定二叉树的叶结点. 函数接口定义: void PreorderPrintLeaves( BinTree BT ); 其 ...
最新文章
- web签名验证程序【跨服务器、中文字符签名方法】-php为例
- (三)Window的特色学习笔记
- 【错误记录】集成 Tinker 热修复报错 ( No such property: variantConfiguration for class: .ApplicationVariantData )
- android442电视怎么投屏,哔哩哔哩怎么投屏电视? b站投屏的方法
- eclipse常用快捷键汇总
- kustomize+argo
- .net 面试题系列文章二(附答案)
- matlab都有什么接口,介绍MATLAB与C++的几种接口方式
- java作为kafka生产者实验及Expiring超时问题解决
- php utc时间_PHP转换UNIX时间戳 UTC时间(TZ格式) 标准时间的方法 UNIX UTC GMT时间、本地时间互转...
- ImageMagick 拆分透明PNG 合并JPG和Alpha Mask
- php粉层,thinkphp 模型分层
- 处理9path图片边缘的小黑点
- beyond compare软件安装与破解
- Derivation of Linear Regression with One Variable
- 程序员的岗位路线规划,不止是编程?
- POSIX是什么,为什么需要POSIX
- C++小实验之vector的 push_back 和 emplace_back 及其使用时机
- EPIC 审批流程设置 BAdI:示例
- 3000通电话培养出一个性格分析专家,阿里“柔军”是这样养成的