• 《剑指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

  • 相关阅读:
    2016"百度之星"
    codeforces 55 div2 C.Title 模拟
    codeforces 98 div2 C.History 水题
    codeforces 97 div2 C.Replacement 水题
    codeforces 200 div2 C. Rational Resistance 思路题
    bzoj 2226 LCMSum 欧拉函数
    hdu 1163 九余数定理
    51nod 1225 余数的和 数学
    bzoj 2818 gcd 线性欧拉函数
    Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学
  • 原文地址:https://www.cnblogs.com/hugechuanqi/p/10662021.html
Copyright © 2020-2023  润新知