数据结构——树的基本概念

本文介绍了树的基本概念,包括结点的度、m叉树、满二叉树与完全二叉树的关系。重点阐述了完全二叉树的性质,并提供了计算叶子结点数和树高度的算法。此外,详细讲解了二叉树的前序、中序和后序遍历递归算法思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.树的一些基本概念

1.度(degree):结点的度——结点拥有子树的个数,度为m的树称为m叉树。

 树的度——各结点度的最大值称为树的度。

2.满二叉树的结点个数:2^k-1,k为二叉树的高度。

3.完全二叉树:由满二叉树自右向左,自下而上去掉叶子结点。

性质1:叶子结点数为n0,度为2的结点数为n2。则n2=n0-1。

证明:总结点数n=n0+n1+n2,每个结点(除根结点外)有且仅有一个树枝进入结点n-1,

从结点出去的树枝数n1+2 * n2,则n-1 = n1+2 * n2

则n2 = n0 -1

性质2:具有n个结点的完全二叉树,高度为log2[n] + 1(log2[n]取下界)

性质3:i = 1,为根节点;

 if(i > 1) Num_Of_Parent = [ i/2 ] 取下界   

if(2i > n) 结点为叶子结点,else Num_Of_Child = 2 * i.

if(2i + 1 > n) 结点没有右儿子

二、二叉树的遍历(递归算法思路)

1.前序遍历:根结点 —— 前序遍历左子树 —— 前序遍历右子树

2.中序遍历:中序遍历左子树 —— 根结点 —— 中序遍历右子树

3.后序遍历:后序遍历左子树 —— 后序遍历右子树 —— 根结点

递归算法实现:

1.前序遍历

void preorder(struct Btree *p)
{
	if(p == NULL) return;
	visit(p);
	preorder(p->left);
	preorder(p->right);
}
2.中序遍历

void inorder(struct Btree *p)
{
	if(p == NULL) return;
	inorder(p->left);
	visit(p);
	inorder(p->right);
}
3.后序遍历
void postorder(struct Btree *p)
{
	if(p == NULL) return;
	postorder(p->left);
	postorder(p->right);
	visit(p);
}

三、树的一些其他算法

1.计算叶子数

int CountLeaf(struct Btree *p)
{
	if(p == NULL) return 0;
	else
		if(!(p->left) && !(p->right))	//叶子结点
			return 1;
		else
			return CountLeaf(p->left)
				+ CountLeaf(p->right);
}

2.交换二叉树左右子树

void change_left_right(struct Btree *p)
{
	Btree *tmp;
	if(p){
		change_left_right(p->left);
		change_left_right(p->right);
		tmp = p->left;
		p->left = p->right;
		p->right = p->left;
	}
}

3.计算二叉树的高度

int height(struct Btree *p)
{
	if(p == NULL) return 0;
	else{
		h1 = height(p->left);
		h2 = height(p->right);
		height = (h1>h2) ? h1 : h2;
		return height+1;
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值