快捷搜索:  汽车  科技

二叉树模型基础知识(5分钟带你认识二叉树)

二叉树模型基础知识(5分钟带你认识二叉树)度为0的结点称为叶子结点。2.2>叶子结点2> 二叉树结点的属性2.1>结点的度结点所拥有的子树的个数称为该结点的度。叶子结点的度为0。

原创: 老表 简说Python

今日问题

""" 介绍二叉树的基础知识 目录 1> 什么是二叉树? 2> 二叉树结点的属性 2.1>结点的度 2.2>叶子结点 2.3>分支结点 2.4>左孩子、右孩子、双亲结点 2.5>路径、路径长度 2.6>祖先、子孙 2.7>结点的层数 3> 树的属性 3.1>树的深度 3.1>树的度 4> 什么是满二叉树? 5> 什么是完全二叉树? 6> 二叉树的基本性质 7> 实战 """

1> 什么是二叉树?

二叉树(Binary Tree),他是n(n>=0)个有限元素的集合,该集合或者为空(n=0) 或者有一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树 组成,当集合为空(n=0)时,称为空二叉树。

2> 二叉树结点的属性

2.1>结点的度

结点所拥有的子树的个数称为该结点的度。叶子结点的度为0。

2.2>叶子结点

度为0的结点称为叶子结点。

2.3>分支结点

度不为0的结点称为分支结点,或称为非终端结点,一棵树除了叶子结点,其他的 结点都是分支结点。

2.4>左孩子、右孩子、双亲结点

一个结点的子树的根结点称为该结点的孩子,该结点称为双亲结点,该结点的左子 树的根结点称为该结点的左孩子,该结点的右子树的根结点称为该结点的右孩子。

2.5>路径、路径长度

如果一颗树的一串结点n1 n2 n3...nk,有如下关系,结点ni是n(i 1)的双亲结点 (1<=i

2.6>祖先、子孙

在树中,如果有一条路径从结点M到结点N,那么结点M称为结点N的祖先,而结点N称 为结点M的子孙。

2.7>结点的层数

规定根结点的层数为1,其余结点层数等与其双亲结点的层数加1。

3> 树的属性

3.1>树的深度

树中所有结点的最大层数称为树的深度。

3.1>树的度

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

4> 什么是满二叉树?

在一颗二叉树中,如果所有的分支结点都有左子树和右子树,并且所有叶子结点都在同一层,这样的 一颗二叉树称为满二叉树。如下所示:

A / \ B C

二叉树模型基础知识(5分钟带你认识二叉树)(1)

5> 什么是完全二叉树?

一颗深度为k的有n个结点的二叉树,对树中的结点按从上到下,从左到右的顺序进行编号,如果编号为i(1<=i<=n) 的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则该树为完全二叉树。

特点:完全二叉树的叶子结点只能出现在最下层和最次层,而且最下层叶子结点集中在左边。

满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。如下图所示:

A / \ B C / \ E F

6> 二叉树的基本性质

6.1> 一颗非空二叉树的第i层上最多有2^(i-1)个结点(i>=1)。

证明:

一个结点最多有两个子树,故 第1层1个结点(2^(1-1)), 第2层最多2个结点(2^(2-1)), 第3层最多4个结点(2^(3-1)) 依次类推:第i层最多有2^(i-1)个结点。

6.2> 一颗深度为k的二叉树中,最多有2^k - 1个结点,最少有k个结点。

证明:

由6.1,可知一颗深度为k的二叉树最多的结点树S = 2^0 2^1 2^2 ... 2^k 由等比数列计算前n项和公式可以计算出:S = 2^k - 1 每一层至少有一个结点,故深度为k的二叉树最少有k个结点。

6.3> 对于一颗非空二叉树,度为0的结点(即叶子结点)总是比度为2的结点多一个,如果叶子结点个数为n0,度数为2的结点为n2,则有 n0 = n2 1。

证明:

假设度数为1的结点数为n1,则二叉树的结点总数S = n0 n1 n2,再根据结点度数的性质,度数为 0的结点没有子结点,度数为1的结点有一个子结点,度数为2的结点有两个子结点,所以二叉树的结点总数还可 以表示为S = n00 n11 n22 1 = n1 2n2 1,所以n0 n1 n2 = n1 2*n2 1 整理 得:n0 = n2 1。

6.4>具有n个结点的完全二叉树的深度为「log2 n」 1

证明:

假设该完全二叉树的深度为k,则该完全二叉树的总结点数应该是在深度为k和深度为k-1的满二叉树之间, 深度为k-1的满二叉树结点总数为:2^(k-1) - 1,想要变成深度为k的完全二叉树,则至少在原二叉树基础上 加一个结点,故深度为k的完全二叉树的结点总数 n >= 2^(k-1) - 1 1 即: 2^(k-1) <= n <= 2^k - 1 < 2^k 解得:log2 n <= k < log2 n 1 由于k为整数,故 k = 「log2 (n 1)」 1 注:「」 表示向下取整,如:「3.5」 = 3

6.5> 对于具有n个结点的完全二叉树,如果按照从上到下,从左到右的顺序对二叉树中的所有结点从1开始顺序编号,则对任意的序号为i的结点有:

(1)如果i > 1,则序号为i的结点的双亲结点的编号为i/2(/ 表示取商的整数部分);如果i = 1,则序号为i 的结点为根结点,无双亲结点。

(2)如果 2i <= n,则序号为i的结点的左孩子结点的序号为2i;如果2i > n,则序号为i的结点无左孩子。

(3)如果 2i 1 <= n,则序号为i的结点的右孩子结点的序号为2i 1;如果2i 1 > n,则序号为i的结点无右孩子。

注:若从0开始编号,则对应的i号结点的双亲结点的编号为:(i-1)/2;左孩子的编号为:2i 1,右孩子的编号为:2i 2。

7> 实战

S:表示二叉树的结点总数 n0:表示叶子结点个数 n1:表示度数为1的结点个数 n2:表示度数为2的结点个数

>7.1 一颗完全二叉树上有1001个结点,求叶子结点的个数?

解:S = n1 2*n2 1 在完全二叉树中度数为1的结点个数最多为1,最少为0(满二叉树) 当n1 = 1 时,有:1001 = 1 2*n2 1 解得:n2 = 999/2,不满足题意,舍; 当n1 = 0 时,有:1001 = 0 2*n2 1 解得:n2 = 500, 又n0 = n1 1 --- 性质3 故 n0 = 501,即叶子结点个数为501。

>7.2 如果根的层次为1,具有61个结点的完全二叉树的高度为多少?

解:这里的高度也就是深度, 由完全二叉树的深度 k = 「log2 n」 1 得 --- 性质4 该完全二叉树的高度为:「log2 61」 1 = 6。

>7.3 在具有100个结点的二叉树中,其边的数目是多少?

解:在二叉树中,除开根结点,每个结点都有一条入边,故100个结点的二叉树中有99条边。

>7.4 写出下面这颗树的基本属性值:

A / \ B C / \ / \ D E F G / \ H I 这是一颗完全二叉树 结点总数:9 度数为0的(叶子)结点数:5 度数为1的结点数:0 度数为2的结点数:4 树的深度:假设根结点为第一层,则树的深度为 4 树的度:2 结点B的双亲结点:A 结点B的左孩子:D 结点B的右孩子:E 结点D的祖先:A 从结点A到结点H为一条路径,路径长度为:3

本文代码思路来自书籍《Python程序员面试宝典》,书中部分代码有问题,文中已经修改过了,并添加上了丰厚的注释,方便大家学习.

最后,我自己是一名从事了多年开发的Python老程序员,辞职目前在做自己的Python私人定制课程,今年年初我花了一个月整理了一份最适合2019年学习的Python学习干货,可以送给每一位喜欢Python的小伙伴,想要获取的可以关注我的头条号并在后台私信我:01,即可免费获取。

猜您喜欢: