• 剑指offer-二叉搜索树的后续遍历


    题目描述

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

    public class Test {
        
        public static void main(String[] args) {
            int[] arr={5,7,6,9,11,10,8};
            System.out.println(verifySquenceOfBST(arr,0, 4));
        }
        
        /**
         * 在后序遍历得到的序列中, 最后一个数字是树的根结点的值。
         * 数组中前面的数字可以分为两部分: 第一部分是左子树结点的值,它们都比根结点的值小
         * 第二部分是右子树结点的值,它们都比根结点的值大。
         * @param sequence 
         * @param start 起始点
         * @param length 序列长度
         * @return 
         */
        public static boolean verifySquenceOfBST(int[] sequence, int start, int length) {
            // 序列为空,返回false
            if(sequence == null || length <= 0) 
                return false;
        
            // 二叉树根节点,后序遍历序列的最后一个
            int root = sequence[length - 1];
            // 左子树结点的数都小于根节点
            int i = 0;
            for(; i < length - 1; i++) {
                if(sequence[i] > root)  // 大于根节点,跳出循环
                    break;
            }
            // 右子树结点的数都大于根节点
            int j = i;
            for(; j < length - 1; j ++) {
                if(sequence[j] < root) 
                    return false;     // 右子树中出现大于根节点的数,直接返回false
            }
            
            // 判断左子树是不是二叉搜索树
            boolean left =true;
            if(i > 0) {  // 左子树存在
                left = verifySquenceOfBST(sequence, 0 ,i);
            }
            
            // 判断右子树是不是二叉搜索树
            boolean right = true;
            if(i < length - 1) { // 右子树存在
                right = verifySquenceOfBST(sequence, i, length - i - 1);
            }
            
            return left && right;
        }
    
    }
  • 相关阅读:
    如何区分DDR1 DDR2 DDR3内存条
    《闪电战》德军攻略
    WINDOWS SERVER 2008 R2安装指南
    【django】django学得好迷茫啊 来个学习规划吧
    【阅读】提问的智慧+有效的报告BUG
    【Python】logging模块学习笔记
    【接口测试】进度表
    【django】django深入学习笔记
    【随笔】2014工作总结
    【英语】Bingo口语笔记(47)
  • 原文地址:https://www.cnblogs.com/zywu/p/5776423.html
Copyright © 2020-2023  润新知