题目:
二叉树的遍历
时间限制: 1 1 1秒 内存限制: 128 M 128M 128M
题目描述
给定一棵二叉树,根据中序遍历的顺序,找到其中值为x的点(可能不止一个),说出它的中序遍历的上一个点是谁(如果是第一个点,则输出 − 1 -1 −1)。
输入描述
第一行两个数 n n n和 x x x,表示有 n n n个点,并且要找的值为 x ( 0 < n , x < = 100 ) x(0 < n,x <= 100) x(0<n,x<=100)。
接下来一行有 n n n个数 a i a_i ai,第 i i i个数表示第 i i i个节点的数值为 a i a_i ai。
输出描述
输出每个 x x x中序遍历的前一个数
样例
输入
5 3
1 3 2 5 3
输出
5
3
提示
树的中序遍历序列为 [ 5 , 3 , 3 , 1 , 2 ] [5,3,3,1,2] [5,3,3,1,2]
第一个 3 3 3前面的数为 5 5 5,第二个3前面的数为 3 3 3
思路及代码
解题思路
- 输入 n , x n,x n,x和二叉树。
cin>>n>>x;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
- 中序遍历二叉树,存储中序遍历序列。
dfs(1);
void dfs(int k) {
if(k*2<=n && a[k*2]!=0) {
dfs(k*2);
}
zhong[++cnt]=a[k];
if(k*2+1<=n && a[k*2+1]!=0) {
dfs(k*2+1);
}
}
- 遍历中序遍历序列,查找 x x x,找到输出它前面那个数,如果它是第一个,输出 − 1 -1 −1。
for(int i=1; i<=n; i++) {
if(zhong[i]==x) {
if(i-1>0) {
cout<<zhong[i-1]<<endl;
}
else {
cout<<-1<<endl;
}
}
}
AC代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[102], zhong[102], cnt=0;
int n, x;
void dfs(int k) {
if(k*2<=n && a[k*2]!=0) {
dfs(k*2);
}
zhong[++cnt]=a[k];
if(k*2+1<=n && a[k*2+1]!=0) {
dfs(k*2+1);
}
}
int main() {
cin>>n>>x;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
dfs(1);
for(int i=1; i<=n; i++) {
if(zhong[i]==x) {
if(i-1>0) {
cout<<zhong[i-1]<<endl;
}
else {
cout<<-1<<endl;
}
}
}
return 0;
}
知识点
二叉树的存储
顺序存储
按满二叉树的结点层次编号,依次存放二叉树中的数据元素。
特点:
- 结点间关系蕴含在其存储位置中
- 浪费空间,适于存满二叉树和完全二叉树
父亲表示法
优缺点:
利用了树中除根结点外每个结点都有唯一的父结点这个性质。很容易找到树根,但找孩子时需要遍历整个线性表。
孩子表示法
缺陷:
只能从根(父)结点遍历到子结点,不能从某个子结点返回到它的父结点。但程序中确实需要从某个结点返回到它的父结点时就需要在结点中多定义一个指针变量存放其父结点的信息。这种结构又叫带逆序的树型结构。关键存储需要的信息,方便我们查找到想找的信息!
二叉树的遍历
二叉树主要有三种遍历方式:先序遍历,中序遍历,后序遍历。
DLR—先序遍历,即先根再左再右
LDR—中序遍历,即先左再根再右
LRD—后序遍历,即先左再右再根
先序遍历:A B D E C
中序遍历:D B E A C
后序遍历:D E B C A
先、中、后是指的根节点的位置
先序遍历
若二叉树为空,则空操作
否则
访问根结点 (D)
前序遍历左子树 (L)
前序遍历右子树 ®
(访问根结点,前序遍历,先访问左子树,等左子树所有的结点都访问过,再访问右子树)
先序遍历序列:A B D C
中序遍历
若二叉树为空,则空操作
否则:
中序遍历左子树 (L)
访问根结点 (D)
中序遍历右子树 ®
(先中序遍历访问左子树所有的结点,后访问根结点,最后访问右子树所有的结点)
中序遍历序列:B D A C
后序遍历
若二叉树为空,则空操作
否则
后序遍历左子树 (L)
后序遍历右子树 ®
访问根结点 (D)
(先中序遍历访问左子树所有的结点,后访问右子树所有的结点,最后访问根结点)
总结
这次我主要讲了以下内容:
- 题目:二叉树的遍历
- 二叉树的存储
- 二叉树的遍历