一、相关概念
结点的深度:到根节点的路径上的边数
树的高度:所有结点的深度的最大值
有根二叉树:每个结点最多只有两个儿子(子节点)的有根树称为二叉树
完整二叉树(full/proper binary tree):每个结点的子节点数量均为0或者2的二叉树
完全二叉树(complete binary tree):只有最下面两层结点度数可以小于2,且最下面一层的结点都集中在该层最左边的连续位置上
完美二叉树(prefect binary tree):所有叶结点的深度均相同的二叉树
二、树的存储
1.双亲表示法
2.孩子表示法
3.双亲孩子表示法
三、树的遍历
1.先序遍历:
遍历顺序:根→左→右
例:
题目描述
给定一棵树,求它的先序遍历的结果。
输入格式
第一行两个整数 n,p,表示共有 n(2≤n≤5000,1≤p≤n) 个节点,且根节点为 p。
接下来 n 行,每三个整数i,l,r(1≤i≤n,0≤l,r≤n),表示 i 的左孩子是 l,右孩子是 r,如果有一个为 0 ,则孩子不存在。
输出格式
一行 n 个整数,表示先序遍历的结果。
输入输出样例
输入 #1
6 4 5 3 1 2 6 0 4 0 5 3 0 0 1 2 0 6 0 0
输出 #1
4 5 3 1 2 6
代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
int n, p;
int pos, l, r;
PII tr[5010];
void f(int x) {
if (!x) return;//当前结点为叶子结点时返回
cout << x << " ";//先输出根
f(tr[x].first);//遍历左子树
f(tr[x].second);//左子树遍历完后遍历右子树
}
int main() {
cin >> n >> p;
while (n--) {
cin >> pos >> l >> r;
tr[pos].first = l, tr[pos].second = r;
}
f(p);
return 0;
}
2.中序遍历
遍历顺序:左→根→右
例:
题目描述
给定一棵树,求它的中序遍历的结果。
输入格式
第一行两个整数 n,p,表示共有 n(2≤n≤5000,1≤p≤n) 个节点,且根节点为 p。
接下来 n 行,每三个整数 i,l,r(1≤i≤n,0≤l,r≤n),表示 i 的左孩子是 l,右孩子是 r,如果有一个为 0 ,则孩子不存在。
输出格式
一行 n 个整数,表示中序遍历的结果。
输入输出样例
输入 #1
6 5 5 0 3 2 6 0 4 0 0 3 1 4 1 2 0 6 0 0
输出 #1
5 6 2 1 3 4
代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
int n, p;
int pos, l, r;
PII tr[5010];
void midTrav(int x) {
if (x) {
midTrav(tr[x].first);//先遍历左子树
cout << x << " ";//当前结点为叶子节点时开始输出左子树并返回
midTrav(tr[x].second);//遍历右子树
}
}
int main() {
cin >> n >> p;
while (n--) {
cin >> pos;
cin >> tr[pos].first >> tr[pos].second;
}
midTrav(p);
return 0;
}
3.后序遍历
遍历顺序:左→右→根
例:
题目描述
给定一棵树,求它的后序遍历的结果。
输入格式
第一行两个整数 n,p,表示共有 n(2≤n≤5000,1≤p≤n) 个节点,且根节点为 p。
接下来 n 行,每三个整数 i,l,r(1≤i≤n,0≤l,r≤n),表示 ii 的左孩子是 l,右孩子是 r,如果有一个为 0 ,则孩子不存在。
输出格式
一行 n 个整数,表示后序遍历的结果。
输入输出样例
输入 #1
6 4 5 1 3 2 0 6 4 5 0 3 0 0 1 0 2 6 0 0
输出 #1
6 2 1 3 5 4
#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
int n, p;
int pos, l, r;
PII tr[5010];
void midTrav(int x) {
if (x) {
midTrav(tr[x].first);
midTrav(tr[x].second);
cout << x << " ";
}
}
int main() {
cin >> n >> p;
while (n--) {
cin >> pos;
cin >> tr[pos].first >> tr[pos].second;
}
midTrav(p);
return 0;
}