《剑指offer》总结三 之二叉树(2)


23、二叉搜索树的后序遍历序列

  • 题目描述:

    输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。

    • 后序遍历:左子树->右子树->根节点
  • 思路:

    对于后序遍历,其最后一个元素是根节点。因此对于序列S,最后一个元素是x(也就是根),如果去掉最后一个元素的序列为T,那么T满足:T可以分成两段,前一段(左子树)小于x,后一段(右子树)大于x,且这两段子树都是合法的后序序列。

    • 二叉搜索树:即二叉查找树、二叉排序树(可以是空树),是具有以下性质的二叉树:

      • 若左子树不空,则左子树上所有节点的值均小于它的根节点的值;

      • 若右子树不空,则右子树上所有节点的值均大于它的根节点的值;

      • 它的左右子树也分别为二叉排序树。

  • (color{red}{代码实现})二叉搜索树的后序遍历

26、二叉搜索树与双向链表(31ms,5756k)

  • 题目描述:

    输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

  • 思路:

    1. 在二叉搜索树中,左子节点的值总是小于父节点的值,右子节点的值总是大于父节点的值。因此,在做转换成排序双向链表时,原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点的指针。(排序双向链表转化成二叉搜索树时,反向进行即可,即链表中指向前一个节点的指针指向二叉搜索树中的左子节点,链表中后一个节点的指针指向二叉二叉搜索树中的右子节点。)

    2. 由于要求转换后的链表是排序的,因此,我们可以通过中序遍历(正好是二叉搜索树中从小到大的顺序)树中的每个节点,每次遍历到根节点时,就把树分为三部分,第一部分为根节点,第二部分为该根节点的左子树,第三部分为该根节点的右子树。然后就可以将f该根节点和其左子树的最大值节点连接起来,并且和该根节点右子树的最小节点连接起来。

    (按照中序遍历的顺序,当我们把遍历转换到根节点时,其左子树已经转换成一个排序的链表了,并且处在链表的最后一个节点是左子树最大值节点。连接上根节点后,接着就去遍历转换右子树,并把根节点和右子树中的最小值节点连接起来。)

    • 二叉搜索树:即二叉查找树、二叉排序树(可以是空树),是具有以下性质的二叉树:

      • 若左子树不空,则左子树上所有节点的值均小于它的根节点的值;

      • 若右子树不空,则右子树上所有节点的值均大于它的根节点的值;

      • 它的左右子树也分别为二叉排序树。

    • 双向链表:双向链表和单链表一样,也是由节点组成,它的每个数据节点中都有两个指针,分别指向直接后继和直接前继。从双向链表的任意一个节点开始,都可以很方便地访问它的前驱节点和后继节点。(排序双向链表是指双向链表中的值已经从小到大排序)

参考:
1、《剑指offer》书籍
2、牛客网在线编程:https://www.nowcoder.com/ta/coding-interviews

原文地址:https://www.cnblogs.com/hugechuanqi/p/10662021.html