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


    }
    }


  • 相关阅读:
    JS 表单submit() 提交无效的问题
    thinkphp中连接oracle时封装的方法无法用
    Struts2 开发流程(转)
    oracle wm_concat(column)函数的使用(转)
    js点击按钮后显示时间自动减少提示
    Windows Server 2008 R2安装过程
    Spring学习之旅(1) 第一个Controller
    Groovy系列 Groovy集合
    Groovy系列 安装Groovy
    VMWare实现共享目录
  • 原文地址:https://www.cnblogs.com/Transkai/p/10927183.html
Copyright © 2020-2023  润新知