树
树是一种用于表达层级结构的数据结构。
树结构是实现高效算法与数据结构的基础,是信息处理与程序设计中不可欠缺的概念。标准库中提供的很多算法和数据结构都与树结构有关。
- 上图是一个简单的二叉树的示意图,对树来说,它是由结点(node),图中由圆圈表示,和连接结点的边(edge)构成,图中用线表示。
- 对树来说,有几个关键概念。
- 父结点,子结点——很好理解,通俗来说,在上面的是父结点,在下面的子结点。对于父结点来说,可以有多个子结点,但是一个子结点只能有一个父结点。
- 兄弟结点——拥有同一个父结点的结点互称为兄弟结点
- 根节点——没有父结点的结点
- 叶结点——没有子结点的结点
- 结点的度——这个结点的子结点数
- 树的度——这棵树中最大的结点的度
- 结点的深度——从根节点到此节点的路径长度
- 结点的高——这个结点到叶结点的最大路径长度
- 树的高——根节点的高度
二叉树
- 在各种树中,我们比较关心二叉树
- 如上图,二叉树就是每个结点最多有两个子结点的树,当然,为了更加准确,我们可以递归地定义二叉树。
满足下列条件之一的树即为二叉树
1.没有任何结点
2.由以下三个不包含共通元素的顶点集合构成根
左子树
右子树
- 二叉树的实现
利用结构体数组
#define NIL -1
//二叉树的结点
struct Node {
itn parent, left, right;
}
//以结构体数组的方式存储二叉树
struct Node binTree[MAX_N];
//声明用来记录深度和高度的数组
int depth[MAX_N], height[MAX_N];
//通过递归,将每个结点的深度填入
void setDepth(int u, int d){
if (u == NIL) return;
D[u] = d;
setDepth(binTree[u].left, d+1);
setDepth(binTree[u].right,d+1);
}
//计算左子树和右子树的高度,并将其中大的那个作为此结点的高度
int setHeight(int u){
int h1 = 0, h2 = 0;
if (binTree[u].left != NIL)
h1 = setHeight(binTree[u].left) + 1;
if (binTree[u].right != NIL)
h1 = setHeight(binTree[u].right) + 1;
return height[u] = max(h1, h2);
}
//获取兄弟结点
int getSibling(int u){
if (binTree[u].parent == NIL) return NIL;
if (binTree[binTree[u].parent].left != u && binTree[binTree[u].parent].left != NIL)
return binTree[binTree[u].parent].left;
if (binTree[binTree[u].parent].right != u && binTree[binTree[u].parent].right != NIL)
return binTree[binTree[u].parent].right;
return NIL;
}
//前序遍历
void preParse(int u){
if (u == NIL) return;
cout<<u<<" ";
preParse(binTree[u].left);
preParse(binTree[u].right);
}
//中序遍历
void inParse(int u){
if (u == NIL) return;
inParse(binTree[u].left);
cout<<u<<" ";
inParse(binTree[u].right);
}
//后序遍历
void postParse(int u){
if (u == NIL) return;
postParse(binTree[u].left);
postParse(binTree[u].right);
cout<<u<<" ";
}