二叉树(线上学习笔记)

图片来源于网络!!!

  • 基本概念
    树是n(n >= 0)个结点的有限集合T(Tree)。 当n = 0 是,称为空树, 当n > 0 时, 该集合满足如下条件:

    1. 其中必定有一个称为(root)的特定节点,它没有前驱, 但有零个或多个直接后续。
    2. 其中n - 1个结点可以分成n1(m >= 0)个互不相交的有限集T1,T2, T3… Tm, 其中Ti又是一棵树,称为根结点的子树。每棵子树的根结点有且仅有一个直接前驱, 但有零个或多个直接后继

    结点:包含一个一个数据元素及若干指向其他结点的分支信息。
    结点的度:一个结点的子树个数称为此结点的度。
    叶结点:度为0的结点,即无后继结点,也称为终端结点。
    分支结点:度不为0的结点,也称为非终端结点。
    孩子节点:一个结点的直接后继称为该结点的孩子结点。
    双亲节点:一个结点的直接前驱称为该结点的双亲结点。
    兄弟结点:同一双亲结点的孩子结点之间互称为兄弟结点。
    祖先结点:一个结点的祖先结点是指从根结点到该结点的路径上的所有结点。
    子孙结点:一个结点的直接后继和间接后继称为该结点的子孙结点。
    树的度:树中所有结点的最大值。
    结点的层次:从根结点开始定义,根结点的层次为1,根结点的后继层次为2,以此类推。
    树的高度(深度):树中所有结点的层次的最大值。
    有序树:在树T中,如果各子树Ti之间是有先后顺序的,则称为有叙述。
    森林:m(m >= 0)棵互不相交的树的集合。将一棵非空树的根节点删去,树就变成了森林;反之,给森林增加一个统一的根节点,就形 成了一棵树。


  • 二叉树
    定义:我们把满足一下两个条件的树形结构叫做二叉树(binary tree)
    1. 每个节点的度都不大于2
    2. 每个结点的孩子节点次序不能任意颠倒
      一个二叉树的每个结点只能含有0,1,2个孩子,且每个孩子有左右之分,位于左边的是左孩子,右边是右孩子。
      在这里插入图片描述
      满二叉树:深度为k且有2^k - 1个节点的二叉树。
      完全二叉树:深度为k,结点为n,且结点1~n的位置序号与满二叉树一一对应
      满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树

在这里插入图片描述
层间从上到下,层内从左到右编号
性质
1.在二叉树的第i层上之多有2^i-1个结点(i>=1)
证:因为是至多,所以假设这是一个满二叉树,也就是每一个结点的度都为2,即每一结点都有两个孩子节点,所以这个数的每一层结点的个数都是上一层的两倍,所以A(i) = 2^i-1。
2.深度为k的二叉树至多有2^k - 1个结点(k >= 1)。
证:深度为k的二叉树,其最大值是将每一层的最大值相加。
3.对于任意一棵二叉树T,N(0) = N(2) + 1(N(i)表示度为i的结点的个数)
证:n = N(0) + N(1) + N(2)
n - 1 = b(b为边数)
且二叉树中的分支都是度为1或2的结点发出,所以
b = N(1) + 2N(2)
整理得
n = b + 1 = N(1) + 2N(2) + 1
将n = N(0) + N(1) + N(2)代入,整理后得N(0) = N(2) + 1

4.具有n个结点的完全二叉树的深度为int(log2n) + 1
5.将完全二叉树自顶而下,同一层自左向右编号,则有:
如果i=1,i为根,无双亲;如果i>1,双亲为结点int(i/2)
如果2i<=n,结点i的左孩子为结点2i;否则无左孩子
如果2i+1<=n,结点i的右孩子为结点2i+1,否则无右孩子


顺序存储结构
二叉树的结构是非线性的,每一结点最多可有两个后继。
二叉树的存储结构有两种:顺序存储结构和链式存储结构在这里插入图片描述
链式存储结构
在这里插入图片描述
声明二叉树的二叉链表结构

typedef struct Node
{
	DataType date;
	struct Node *LChild;
	struct Node *RChild;
	struct Node *Parent;
}BiTNode, *BiTree;

二叉树的遍历
用L, D, R分别表示遍历左子树,访问根节点,遍历右子树。
升序遍历 DLR
中序遍历 LDR
后序遍历 LRD

发布了2 篇原创文章 · 获赞 0 · 访问量 6

猜你喜欢

转载自blog.csdn.net/DYNHlalalalala/article/details/105483418