概念:
二叉树的概念:二叉树(Binary Tree)是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。这种结构类似于自然界中的树,其中每个节点可以有零个、一个或两个子节点。
基本特点:
二叉树的基本特点包括:
- 根节点(Root): 树的顶部节点,没有父节点。
- 父节点(Parent): 每个非根节点都有一个父节点,它是其直接连接的上层节点。
- 子节点(Child): 节点的直接下层节点,可以有零个、一个或两个子节点。
- 叶子节点(Leaf): 没有子节点的节点,即没有左子节点和右子节点的节点。
- 深度(Depth): 从根节点到某个节点的唯一路径的长度。
- 高度(Height): 从某个节点到其深度最大的叶子节点的路径长度。
种类:
二叉树的种类包括:
- 满二叉树(Full Binary Tree): 除了叶子节点,每个节点都有两个子节点。
- 完全二叉树(Complete Binary Tree): 除了最后一层,其他层都被填满,最后一层从左到右填充,缺少的位置只能在最右边留空。
能够解决哪些问题?(不完全)
二叉树作为一种灵活的数据结构,在计算机科学和算法设计中有许多应用。以下是二叉树能够解决的一些常见问题:
-
搜索和查找: 二叉搜索树(BST)是一种特殊类型的二叉树,它保持左子树节点的值小于父节点的值,右子树节点的值大于父节点的值。这使得在BST中进行搜索和查找操作的时间复杂度为O(log n),其中n是树中节点的数量。
-
排序: 通过对二叉搜索树进行中序遍历,可以得到有序的节点序列,实现对数据的排序。
-
图的表示: 二叉树可以用来表示无向图,其中每个节点代表图中的一个顶点,每个节点的左右子节点表示与该顶点相邻的顶点。
-
表达式树: 二叉树可以用来表示数学表达式,其中叶子节点是操作数,而内部节点是运算符。通过遍历表达式树,可以求解数学表达式的值。
-
文件系统和目录结构: 文件系统中的目录结构通常可以表示为树形结构,其中每个目录是树中的节点,子目录是父目录的子节点。
例题:
P1305 新二叉树 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 n。(1≤n≤26)
后面 $n$ 行,每一个字母为节点,后两个字母分别为其左右儿子。特别地,数据保证第一行读入的节点必为根节点。
空节点用 '*' 表示
输出格式
二叉树的前序遍历。
样例输入
6
abc
bdi
cj*
d**
i**
j**
样例输出
abdicj
思路:
利用结构体存节点和孩子,将表示节点的字母node作为数组tree下标,左孩子存入结构体中的left,右孩子存入结构体中的right,采用一边输入一边存储的方式完成输入,最后输出(要求输出该二叉树的先序遍历)时,所以先输出node。
代码:
#include<bits/stdc++.h>
using namespace std;
struct tree { //定义结构体来存树的节点
char left; //left代表左孩子
char right; //right代表右孩子
}tree[110];
void pre(char node){
cout<<node; //要求输出先序遍历,所以先输出节点
if(tree[node].left!='*') //当存孩子的节点不为空时,递归
pre(tree[node].left);
if(tree[node].right!='*')
pre(tree[node].right);
}
int main(){
int n;
char x,l,r,sx;
scanf("%d",&n);
cin>>sx>>l>>r; //第一个节点为根节点,所以先输入
tree[sx].left=l;
tree[sx].right=r;
for(int i=1;i<n;i++){
cin>>x>>l>>r; //输入其他节点
tree[x].left=l;
tree[x].right=r;
}
pre(sx);
return 0;
}