二叉树

本文详细介绍了二叉树的基本概念,包括祖先和子孙、深度、高度与层数,并探讨了满二叉树和完全二叉树的区别。接着,阐述了两条关于非空二叉树的定理,以及三种层次遍历方式:先序、中序和后序。此外,文章还讲解了二叉检索树的特性、插入操作和删除策略,强调了在删除时保持二叉检索树性质的重要性。

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

本文包含以下内容:

一.二叉树的一些基本概念

二.两条定理

三.二叉树的层次历遍

四.二叉树的数组实现和链表实现

五.二叉检索树

六.总结


一.二叉树的基本概念

二叉树:一个点的集合,这个集合要么为空,要么包含一个根节点和两个子二叉树

祖先和子孙:如果一条路径从结点R至M,那么R是M的祖先,M是R的子孙

深度、高度、层数:R至M路径长度为L,则至M的深度为L,高度为L+1,层数为L

满二叉树和完全二叉树:满二叉树是指一个结点要么是叶子节点,要么有两个非空子节点

                                         完全二叉树是指每一层结点都是从左至右散布,除了最后一层可以不满,其他每一层都是满的

                                         满二叉树不一定是完全二叉树,完全二叉树也不一定是满二叉树


二.两条定理

定理一:对于非空满二叉树,叶节点数等于分支节点数加1

证明:(非严格证明,仅为个人理解)

            当n=1时,分支节点数0,叶节点数为1,此时有叶节点的数目等于分支节点的数目加一

            此后,每增加一个分支节点,原本的叶节点就会减少一个,但是会增加两个新的叶节点,

            也就是说,总体上分支节点的数目每增加一个,叶节点的数目也会相应增加一个。

            因为n=1的时候结论成立。因此,总有叶节点的数目等于分支节点的数目加一。

           

           

定理二:对于任意一个非空二叉树,空子树的数目等于结点数加1

证明:(非严格证明,仅为个人理解)

              当n=1时,空子树数目为2,结点数为1,空子树的数目等于节点数目加1

              此后,每增加一个结点,原先空子树的数目会减1,但是会增加两颗新的空子树

             也就是说,节点数目每增加1,空子树数目对应加1.

             因此,对于任意一棵非空二叉树,总有空子树的数目等于结点数加1成立


三.二叉树的层次历遍

三种历遍方式:

先序、中序、后序

先序:先访问根节点,再访问其整颗左子树,再访问其整颗右子树

中序:先访问整颗左子树,再访问根节点,再访问整颗右子树

后序:先访问整颗左子树,在访问整颗右子树,最后访问根节点




前序输出:ABDCEGFHI

中序输出:BDAGECHFI

后序历遍:DBGEHIFCA


代码:

前序

void preorder(BinNode<E>* root) {
<span style="white-space:pre">	</span>if (root == NULL)return;
<span style="white-space:pre">	</span>else {
<span style="white-space:pre">		</span>visit(root);
<span style="white-space:pre">		</span>preorder(root->left);
<span style="white-space:pre">		</span>preorder(root->right);
<span style="white-space:pre">	</span>}
}

中序

void midorder(BinNode<E>* root) {
	if (root == NULL)return;
	else {
		preorder(root->left);
		visit(root);
		preorder(root->right);
	}
}
后序

void lastorder(BinNode<E>* root) {
	if (root == NULL)return;
	else {
		preorder(root->left);
		preorder(root->right);
		visit(root);
	}
}


四.二叉树链表实现和数组实现


五.二叉检索树

1.什么是二叉检索树

二叉检索树每个结点有一个键K,左子树的K值全部小与根节点,右子树的K全部大于或等于根节点的K

这样子,可以将检索时间缩小一半。


2.二叉检索树的插入

 递归历遍插入


3.二叉检索树的删除

删除最小的一个节点:

       找到最左的结点l,让其父节点指向l的右子树,删除结点l

删除值为K的结点:

      先找到值为K的结点,

     如果其没有子树,直接删除,让原本指向它的父节点指针指向空。

     如果有子树:思路是找到左子树里最大的结点   或者  右子树里最小的结点,让其取代原本要删除的结点的位置

                注意:如果子树里有相同的元素,只能选右子树里最大的结点取代。

                         原因可以看定义,二叉检索树左子树的K一定严格小与根节点,二右子树则是大于等于

     







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值