zoukankan      html  css  js  c++  java
  • 255. Verify Preorder Sequence in Binary Search Tree

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.

    You may assume each number in the sequence is unique.

    Follow up:
    Could you do it using only constant space complexity?

    二分搜索树的特点是左子树的值小于该节点,该节点小于右子树的值。本题的思路是,存储一个low值,用一个stack来存储遍历的数组值,首先遍历树的左子树,因为左子树的值都是小于cur的值,因此为了保证可以判断正确,将 low取值为Integer.MIN_VALUE;然后每次先进行一次判断,看当前的值是否大于stack的peek值,如果不大于,则说明还在左子树上面迭代,每次将其值存入stack里面。直到出现了右子树上面的点,因为其上面的点会大于其父节点,但是肯定小于父节点的父节点,因此,可以利用这一性质来确定是哪个节点的右节点。它是肯定会小于其父节点的所有父节点。代码如下:

     1 public class Solution {
     2     public boolean verifyPreorder(int[] preorder) {
     3         int low = Integer.MIN_VALUE;
     4         Stack<Integer> stack = new Stack<Integer>();
     5         for(int p:preorder){
     6             if(p<low) return false;
     7             while(!stack.isEmpty()&&p>stack.peek()){
     8                 low = stack.pop();
     9             }
    10             stack.push(p);
    11         }
    12         return true;
    13     }
    14 }

    follow up有一点难度,就是要求在常数的空间内完成,这里面不用stack来做,而是创建一个int来做为索引,用来记录最近的中间结点的索引值,左子树遍历的时候,是一切正常的,和上面的做法类似,而到了右子树的时候,将右子树的值和其父节点(i所在索引值)比较,如果大于,则不断循环,然后将当前值(右子树的值)存储在i的后面的位置,代码如下:

     1 public class Solution {
     2     public boolean verifyPreorder(int[] preorder) {
     3         int low = Integer.MIN_VALUE;
     4         int i=-1;
     5         for(int p:preorder){
     6             if(p<low) return false;
     7             while(i>=0&&p>preorder[i]){
     8                 low = preorder[i--];
     9             }
    10             preorder[++i] = p;
    11         }
    12         return true;
    13     }
    14 }
  • 相关阅读:
    vue中使用v-bind="$attrs"和v-on="$listeners"进行多层组件监听
    钉钉小程序开发遇到的坑
    promise、async、await、settimeout异步原理与执行顺序
    js获取url参数值的几种方式
    ES6解构赋值
    2019年前端面试题
    浏览器兼容问题踩坑收集
    react+antd分页 实现分页及页面刷新时回到刷新前的page
    无侵入埋点
    CSS学习笔记(三)空白符和换行
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6603323.html
Copyright © 2011-2022 走看看