树相关问题和算法(挖坑,后面更新)

一、二叉树

1. 性质

①在二叉树第n层上,至多有2^(n-1)个结点。

②深度为k的二叉树,至多有(2^k)-1个结点。

③对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2。有n0=n2+1

2. 二叉树遍历

①先序遍历

(根左右)先访问根结点(打印)→先序遍历左子树→先序遍历右子树

上图先序遍历结果:1 2 4 6 7 8 3 5

②中序遍历

(左根右)中序遍历左子树→访问根结点(打印)→中序遍历右子树

上图中序遍历结果:4 7 6 8 2 1 3 5

③后序遍历

(左右根)后序遍历左子树→后序遍历右子树→访问根结点(打印)

上图后序遍历结果:7 8 6 4 2 5 3 1

④再举个栗子

上图: 先序 - + a * b - c d / e f
            中序 a + b * c - d - e / f
            后序 a b c d - * + e f / -

上图为表达式:a+b*(c-d)-e/f

先序、中序、后序 刚好对应着 前缀表达式、中缀表达式、后缀表达式

3. 线索二叉树

  • n个结点的二叉链表中含有n+1(2n-(n-1)=n+1)个空指针域。利用二叉链表中的空指针域,存放指向结点在某种遍历次序下的前驱和后继结点的指针(这种附加的指针称为"线索")。
  • 线索二叉树建立方式:

    记ptr指向二叉链表中的一个结点,以下是建立线索的规则:
    (1)如果ptr->lchild为空,则存放指向中序遍历序列中该结点的前驱结点。这个结点称为ptr的中序前驱;
    (2)如果ptr->rchild为空,则存放指向中序遍历序列中该结点的后继结点。这个结点称为ptr的中序后继;
    显然,在决定lchild是指向左孩子还是前驱,rchild是指向右孩子还是后继,需要一个区分标志的。因此,我们在每个结点再增设两个标志域ltag和rtag,注意ltag和rtag只是区分0或1数字的布尔型变量,其占用内存空间要小于像lchild和rchild的指针变量。结点结构如下所示。

    (1)ltag为0时指向该结点的左孩子,为1时指向该结点的前驱;

    (2)rtag为0时指向该结点的右孩子,为1时指向该结点的后继;

二、平衡二叉查找树

三、红黑树

四、B树

五、其他

1. 先、中、后序互求

①已知前、中,求后序

前序用来确定根结点,第一个是最开始的根结点;

中序用来确定左右子树,在根结点左边为左子树,在右边为右子树;

根据这递推画出树,再由树写出后序

例:由下面的可以画出上图

前:GDAFEMHZ

中:ADEFGHMZ

②已知中、后,求前序

后序用来确定根结点,最后一个是最开始的根结点;

中序用来确定左右子树,在根结点左边为左子树,在右边为右子树;

根据这递推画出树,再由树写出前序

例:由下面的可以画出上图

后:AEFDHZMG

中:ADEFGHMZ

猜你喜欢

转载自blog.csdn.net/weixin_39731083/article/details/81321235