zoukankan      html  css  js  c++  java
  • 《剑指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

  • 相关阅读:
    [读书笔记]捉虫日记
    花生壳建站全过程
    (step4.3.9)hdu 1584(蜘蛛牌——DFS)
    鼠标移到导航上面 当前的LI变色 处于当前的位置
    JavaScript学习笔记
    由Maximum Gap,对话桶排序,基数排序和统计排序
    安德鲁斯Launcher得到的装在手机的应用程序列表
    broadAnywhere:Broadcast组件权限绕过漏洞(Bug: 17356824)
    Ubuntu logomaker sh: 1: pngtopnm: not found 解决方案
    HDU 1598 find the most comfortable road (罗列+Kruskal) 并检查集合
  • 原文地址:https://www.cnblogs.com/hugechuanqi/p/10662021.html
Copyright © 2011-2022 走看看