11.二叉树基本理论

一、二叉树基本概念

1.定义

二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(或称空二叉树),或者由一个根节点和两颗互不相交的、分别称为根结点的左子树和右子树的二叉树组成。

2.二叉树特点

(1)每个结点最多有两颗子树,所以二叉树中不存在度大于2的结点;

(2)左子树和右子树是有顺序的,次序不能任意颠倒;

(3)即使树中某节点只有一颗子树,也要区分它是左子树还是右子树。

另外,二叉树具有五种基本形态:

a.空二叉树;b.只有一个根结点;c.根结点只有左子树;d.根结点只有右子树;e.根结点既有左子树又有右子树

3.特殊的二叉树

(1)斜树:所有的结点都只有左子树的二叉树称为左斜树;所有结点都是只有右子树的二叉树称为右斜树。特点:每一层都只有一个结点,结点的个数与二叉树的深度相同。

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

满二叉树特点:a)所有的叶子只能出现在最下一层且处于同一层;

b)非叶子结点的度一定是2;

c)在同样深度的二叉树中,满二叉树的结点个数最多,叶子数最多。

(3)完全二叉树:对一颗具有n个结点的二叉树按层序编号,如果编号为i(1=<i<=n)的结点与同样深度的满二叉树编号为i的结点在二叉树中位置完全相同,则这颗二叉树称为完全二叉树。

完全二叉树特点:a)叶子结点只能出现在最下两层;

b)最下层的叶子一定出现在左部连续位置;

c)倒数二层,若有叶子结点,一定都在右部连续位置;

d)如果结点度为1,则该结点只有左孩子,即不存在只有右子树的情况;

e)同样结点数的二叉树,完全二叉树的深度最小。

总之:满二叉树一定是一颗完全二叉树,但完全二叉树不一定是满的。在判别是否为二叉树时,我们只需给每个结点按照满二叉树的结构逐层顺序编号,如果编号出现了空档,就说明该树不是完全二叉树,都在就是。

二、二叉树的性质

1.性质1:在二叉树的第i层上至多有2^(i-1)个结点(i>=1).

分析:计算二叉树某一层的结点数。这里的"至多"指的是,当该二叉树为满二叉树时,由数学归纳法论证可知,第i层有最多可以有2^(i-1)个结点。

2.性质2:深度为k的二叉树至多有2^k-1个结点(k>=1)

分析:计算二叉树结点总数。这里"深度为k"指有k层的二叉树,当该二叉树为满二叉树时,由数学归纳法论证可知,该二叉树至多有2^k-1个结点。

3.性质3:对任何一颗二叉树T,如果其终端结点数为n0,度为2的结点数为n2,则no=n2+1.

分析:一颗二叉树主要有n0个度为0的叶子结点、n1个度为1的结点、n2个度为2的结点组成。因此,该二叉树的结点总数n=n0+n1+n2(方程1).从二叉树中连接线数可知,由于根结点只有分支出去,没有分支进入,所有分支线总数减去1,即二叉树分支线总数=n-1=n1+2n2(方程2)(其中n1为度为1的结点数、n2为度为2的结点数)。联立方程得:n0=n2+1.

4.性质4:具有n个结点的完全二叉树的深度为「log2^n」+1 (「x」表示不大于x的最大整数)。

分析:由性质2我们可以知道,深度为k的满二叉树的结点数n=2^k-1。由其倒推得到满二叉树的度数为k=log2^(n+1)。由于完全二叉树是满二叉树的一个子集,它的结点数一定少于等于同样度数的满二叉树的结点数2^k-1,但一定多于2^(k-1)-1。即满足2^(k-1)-1<n<2^k-1.

由于结点数n是整数,n<2^k-1=<2^k且n>2^(k-1)-1>=2^(k-1),所以2^(k-1)<n<2^k,再不等式两边取对数,得到k-1=<log2^n<k,而k作为度数也是整数,因此k=「log2^n」+1.

5.性质5:如果对一颗有n个结点的完全二叉树(其深度为「log2^n」+1)的结点按层序编号(从第1层到第「log2^n」+1

层,每层从左到右),对任一结点i(1=<i<=n)有:

(1)如果i=1,则结点是i的二叉树的根,无双亲;如果i<1,则其双亲是结点[i/2];

(2)如果2i>n,则结点i无左孩子(结点i为叶子结点);否则其左孩子是结点2i;

(3)如果2i+1>n,则结点i无右孩子;否则其右孩子是结点2i+1.

三、二叉树的存储结构

1.二叉树顺序存储结构

由于二叉树是一种特殊的树,使得顺序存储结构得以实现。二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也就是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系,左右兄弟的关系等。(k个结点,需要分配2^k-1个存储单元空间)

注意:顺序存储结构一般只用于完全二叉树。

 

2.二叉链表

(1)核心思想

二叉树每个结点最多有两个孩子,所有为它设计一个数据域和两个指针域,用来指向该结点的左右孩子,我们称为这样的链表为二叉链表。

(2)结点结构

其中,data为数据域,lchild和rchild都是指针域,分别存放指向左右孩子的指针

(3)二叉链表的结点结构定义代码

/*二叉树的二叉链表结点结构定义*/

typedef struct BiTNode    /*结点结构*/

{

TElemtype data;    //结点数据

struct BiTNode *lchild,*rchild;//左右孩子指针

} BiTNode,*BiTree;

(4)结构实例

>>二叉链表

 

>>三叉链表:parent指针域存放指向结点双亲的指针

时间: 2024-12-13 14:50:23

11.二叉树基本理论的相关文章

大话数据结构(十五)——二叉树的理论知识(2)

1 二叉树的存储结构 1.1 顺序存储结构 二叉树的顺序存储结构就是用一维数组存储二叉树中的结点,并且结点的存储位置,也是数组的下标要能体现结点之间的逻辑关系,比如双亲与孩子的关系. 一棵完全二叉树的存储: 一般二叉树存储:尽管层序编号不能反映逻辑关系,但是可以将其按完全二叉树编号,只不过把不存在的结点设置为"^". 极端情况,右斜树,这不建议使用 1.2 二叉链表 二叉树每个结点最多有两个孩子,所以为它设计一个数据域和两个指针域是比较自然的,我们称这样的链表叫做二叉链表. lchil

研磨数据结构与算法-11二叉树的基本操作

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

Solution 11: 二叉树中节点的最大距离

问题描述 RT. 如果把二叉树看做是一张图,父子节点的连线看成是双向的,距离的定义为两个节点之间变得数目. 解决思路 求根节点的左子树的高度和右子树的高度,相加. 程序 public class MaxDistanceInTree { public int getMaxDistanceInTree(TreeNode root) { if (root == null) { return 0; } int leftHeight = getHeightOfTree(root.left); int ri

数据结构之树与二叉树(理论篇)

一.树 树的定义:树是n(n>=0)个结点的有限集. 对于任意一棵非空树:(1)有且仅有一个特定的结点称为根结点:(2)当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,T3···,Tm,其中每一个集合本身又是一棵树,并且称为根的子树. 结点:树的结点包含一个数据元素及若干指向其子树的分支. 度(degree):结点拥有的子树数称为结点的度. 叶子(leaf):度为0的结点称为叶子或终端结点:度不为0的结点称为非终端结点或分支结点,除根结点外,分支结点也称为内部节点.

11.二叉树

python实现二叉树的数据结构: . 二叉树的排序方式: - 广度遍历(层次遍历) - 深度遍历: - 前序(根左右):把根放到最前面 - 中序(左根右):把根放到中间 - 后序(左右根):把根放到最后 class Node(): def __init__(self,item): self.item = item self.right = None self.left = None class Tree(): def __init__(self): self.root = None def a

11、OSPF理论一

纯数据结构Java实现(4/11)(BST)

个人感觉,BST(二叉查找树)应该是众多常见树的爸爸,而不是弟弟,尽管相比较而言,它比较简单. 二叉树基础 理论定义,代码定义,满,完全等定义 不同于线性结构,树结构用于存储的话,通常操作效率更高.就拿现在说的二叉搜索树(排序树)来说,如果每次操作之后会让剩余的数据集减少一半,这不是太美妙了么?(当然不当的运用树结构存储,也会导致从 O(logN) 退化到 O(n)). 值得说明,O(logN) 其实并不准确,准确来说应该说 O(树的高度) 定义&性质&行话 树里面常见的二叉树: BST,

C语言实现有序二叉树(1)

在cpp中使用的C语言 头文件 1 /* 有序二叉树 BsTree */ 2 #ifndef _BT_H 3 #define _BT_H 4 /*节点*/ 5 typedef struct BsTreeNode 6 { 7 int data;/* 数据 */ 8 struct BsTreeNode* left;/* 左子树 */ 9 struct BsTreeNode* right;/* 右子树 */ 10 }BSTREE_NODE; 11 /* 二叉树 */ 12 typedef struct

二叉树常见遍历算法

这几天在复习关于树的各种算法,做了一些题,也搜索了网上各种算法,现在来总结一下树的各种常见算法.本文涵盖: 二叉树先中后序遍历(递归&非递归)算法 层次遍历(正序&逆序&锯齿形)非递归算法 二叉树深度算法 结点总数算法 1.二叉树先序非递归遍历 //先序非递归遍历 public ArrayList<Integer> preorderTraversal2(TreeNode root) { Stack<TreeNode> stack = new Stack<