zoukankan      html  css  js  c++  java
  • 剑指offer 23.举例让抽象具体化 二叉搜索树的后序遍历序列

    题目描述

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

    采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。

    由题意可得:
    1. 后序遍历序列的最后一个元素为二叉树的根节点;
    2. 二叉搜索树左子树上所有的结点均小于根结点、右子树所有的结点均大于根结点。

    算法步骤如下:
    1. 找到根结点;
    2. 遍历序列,找到第一个大于等于根结点的元素i,则i左侧为左子树、i右侧为右子树;
    3. 我们已经知道i左侧所有元素均小于根结点,那么再依次遍历右侧,看是否所有元素均大于根结点;若出现小于根结点的元素,则直接返回false;若右侧全都大于根结点,则:
    4. 分别递归判断左/右子序列是否为后序序列;
     

    代码如下: 


    package jianzhioffer.tree;

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

    public boolean VerifySquenceOfBST(int [] sequence) {
    if (sequence.length==1) {
    return true;
    }
    if (sequence.length==0) {
    return false;
    }

    return judge(sequence, 0, sequence.length-1);


    }
    public boolean judge(int[] a,int start,int end) {
    if (start>end) {
    return true;
    }
    int root=a[end];
    int i=start;
    while (a[i]<root) {
    i++;
    }
    boolean left=judge(a, start, i-1);
    int j=i;
    while (j<end) {
    if (a[j]<a[end]) {
    return false;
    }
    j++;

    }
    boolean right=judge(a, i, end-1);


    return left&&right;


    }
    }


  • 相关阅读:
    解析SQL Server之任务调度
    Sqlserver (转载)事物与锁
    浅谈SQL Server数据内部表现形式
    浅谈SQL Server事务与锁(上篇)
    如何查看某个查询用了多少TempDB空间
    Select count(*)和Count(1)的区别和执行方式
    zookeeper 源码(二) session 和 处理事务请求
    zookeeper 源码(一) 选举和同步数据
    分布式一致性协议 --- Paxos
    分布式事务 --- 2PC 和 3PC
  • 原文地址:https://www.cnblogs.com/Transkai/p/10927183.html
Copyright © 2011-2022 走看看