zoukankan      html  css  js  c++  java
  • 判断是否为二叉搜索树的后序遍历序列

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

    题目链接:https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

    知识点:

    二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树

    二叉排序树或者是一棵空树,或者是具有下列性质的二叉树

    (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

    (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;

    (3)左、右子树也分别为二叉排序树;

    (4)没有键值相等的节点。

    而且这里题目也强调了第四点,任意两个数字都不同,也就是没有键值相等的点。

    分析:

    已知条件:后序序列最后一个值为root;二叉搜索树左子树值都比root小,右子树值都比root大。

    1、确定root;

    2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;

    3、遍历右子树,若发现有小于root的值,则直接返回false;(不用再去遍历左子树确认是否有大于root的值,因为上一步找到第一个大于root值的位置的时候,就已经确认了左边一定全部小于root)

    4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。

    AC代码:

    public class Solution {
        public boolean VerifySquenceOfBST(int [] sequence) {
            if (sequence == null || sequence.length == 0)    return false;
            return Vertify1(sequence, 0, sequence.length - 1);
        }
        private boolean Vertify1(int[] a, int start, int end) {
            if (start >= end)    return true; // 截止条件可用[4,6,7,5]数据测试
            int i = start;
            while (a[i] < a[end]) {
                ++i;
            }
            for (int j = i; j < end; ++j) {
                if (a[j] < a[end])    return false;
            }
            return Vertify1(a, start, i - 1) && Vertify1(a, i, end - 1);
        }
    }

    ================Talk is cheap, show me the code===================

    CSDN博客地址:https://blog.csdn.net/qq_34115899
  • 相关阅读:
    JAVAEE学习day01
    learn MongoDB (二) 常用修改器
    learn MongoDB (一) 常用命令行操作
    js事件冒泡和捕获
    vim 常用设置
    void 0 等于 undefined 为什么不直接用undefined
    原生js操作class
    WAI-ARIA roles
    css 效果收集
    前端文章收集
  • 原文地址:https://www.cnblogs.com/lcy0515/p/10807833.html
Copyright © 2011-2022 走看看