树是一种用于表达层级结构的数据结构。
树结构是实现高效算法与数据结构的基础,是信息处理与程序设计中不可欠缺的概念。标准库中提供的很多算法和数据结构都与树结构有关。

在这里插入图片描述

  • 上图是一个简单的二叉树的示意图,对树来说,它是由结点(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<<" ";
}

返回目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值