二叉树的知识概括

本文详细介绍了二叉树的定义、性质,包括二叉树的层数、结点数量的关系,以及完全二叉树的特性。同时,文章探讨了二叉树的遍历方法,包括先序、中序和后序遍历,并通过实例解释了遍历过程。此外,还提及了最优二叉树(哈夫曼树)的概念及其构造方法。

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

二叉树的定义

二叉树是n(n>=0)个结点的有限集合,它或者是空树(n=0),或者是由一个根结点及两棵不相交的且分别称为左,右子树的二叉树所组成。可见,二叉树同样具有递归的性质。
需要注意的是,尽管二叉树和树有很多概念之间的联系,但是他们是两个不同的概念。树和二叉树之间最主要的区别是:二叉树中的结点的子树要区分左子树和右子树,即使在结点只有一棵子树的情况下,也要分别出是左子树和右子树。另外,二叉树结点的最大度为2,树中无结点度数限制。如下图所示。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二叉树的性质

(1)二叉树第i层(i>=1)上最多有2i-1个结点。此性质根据数学归纳法对层数i进行数学归纳即可证明。
(2)高度为k的二叉树最多有2
k-1个结点(k>=1)。由性质1,每一层的结点数都取最大值2k-1即可。
(3)对于任何一棵二叉树,若其终端结点数为n0,度为2的结点数为n2,则n0=n2+1。
(4)具有n个结点的完全二叉树的深度为【log2n】+1。
若深度为k的二叉树有2
k-1个结点,则称其为满二叉树。可以对满二叉树中的结点进行连续编号:约定编号从根结点起,自下而上,自左向右依次进行。深度为k,有n个结点的二叉树,当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时,称为完全二叉树。满二叉树如图a所示,高度为三的一个完全二叉树如图b所示。在一个高度为h的完全二叉树中,除了第h层(最后一层)其余各层都是满的,切h层结点必须从左至右放置,不能留空。图c所示的二叉树不是完全二叉树,因为六号结点的左边有空结点。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

二叉树的遍历

二叉树的遍历是按某种策略访问树中的每个结点,切仅访问一次的过程。由于二叉树所具有的递归性质,一棵非空的二叉树是由根结点,左子树,右子树三部分构成的,因此若能遍历这三部分,也就遍历的整个二叉树。按照先遍历左子树后遍历右子树的方式,可以得到二叉树的先序,中序,后序遍历三种遍历方法。
1.先序遍历
假设二叉树如图所示
在这里插入图片描述
先序遍历的含义是先访问根结点,再访问左子树,最后访问右子树,因此首先访问根结点1,之后访问左子树,左子树也同样先访问根结点2,在访问2的左子树,左子树只有一个叶子4,所以左子树访问完成,之后访问2的右子树,右子树只有一个叶子5,所以2的右子树访问完成,即1的左子树访问完成,之后访问1的右子树,同理先访问根结点3,再访问3的左子树6,再访问3的右子树7,此时1的右子树也访问完成,此二叉树的先序遍历也完成了。得到的先序遍历结果为1245367
访问顺序由图所示
在这里插入图片描述

2.中序遍历
假设也使用之前的树图。中序遍历的含义是先访问左子树,再访问根结点,最后访问右子树。因此首先访问1的左子树,1的左子树根结点为2,2有左子树,首先访问2的左子树,2的左子树只有一个叶子4,即访问4,再访问根结点2,再访问2的右子树,2的右子树只有一个叶子5,即访问5。此时1的左子树访问完成,之后便访问根结点1,再访问1的右子树。1的右子树根结点为3,3的左子树只有一个叶子6,所以访问6,再访问根3,再访问3的右子树,3的右子树只有一个叶子7,即访问7。所以访问序列为4251637
访问顺序由图所示
在这里插入图片描述

3.后序遍历
假设也使用之前的树图。后序遍历的含义是先访问左子树,再访问右子树,最后访问根。因此首先访问1的左子树,1的左子树根结点为2,2有左子树,首先访问2的左子树,2的左子树只有一个叶子4,即访问4,再访问2的右子树,2的右子树只有一个叶子5,即访问5,再访问根结点2。此时1的左子树已经访问完成,之后访问1的右子树。1的右子树根结点为3,3的左子树只有一个叶子6,所以访问6,再访问3的右子树,3的右子树只有一个叶子7,即访问7,之后再访问根结点3,最后访问根结点1。由此访问结束,得到的访问序列为4526731。
访问顺序由图所示
在这里插入图片描述

二叉树遍历算法介绍

先序遍历算法

void Pre(Tree tree){
    if(root!=NULL){
    System.out.print(tree->data);
    Pre(tree->lchild);
    Pre(tree->rchild);
    }
}

中序遍历算法

void Pre(Tree tree){
    if(root!=NULL){
    Pre(tree->lchild);
       System.out.print(tree->data);
    Pre(tree->rchild);
    }
}

后序遍历算法

void Pre(Tree tree){
    if(root!=NULL){
    Pre(tree->lchild);
    Pre(tree->rchild);
     System.out.print(tree->data);
    }
}

最优二叉树

1.最优二叉树
最优二叉树又称为哈夫曼树,它是一类带权路径长度最短的树。路径是从树中一个结点到另一个结点之间的通路,路径上的分支数目称为路径长度。
树的路径长度是从树根到每一个叶子之间的路径长度和。结点的带权路径长度为从该结点到树根之间的路径长度与该结点权值的乘积。
树的带权路径长度为树中所有叶子结点的带权路径长度之和,记为:WPL=w1l1+w2l2+…+wk*lk。
其中,n为带权叶子结点数目,wk为叶子结点的权值,lk为叶子结点到根路径长度。
哈夫曼树是指权值为w1,w2,w3。。。。wn的n个叶子结点的二叉树中带权路径长度最小的二叉树。
例如下图,其中(WPL=35)是带权路径长度最小的二叉树。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2.构造最优二叉树
假设有一组二叉树的结点数据为:1,2,5,9,12,15构造过程如图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
哈夫曼编码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值