zoukankan      html  css  js  c++  java
  • 《程序员代码面试指南》第三章 二叉树问题 根据后序数组重建搜素二叉树

    题目

    根据后序数组重建搜素二叉树
    

    java代码

    package com.lizhouwei.chapter3;
    
    /**
     * @Description:根据后序数组重建搜素二叉树
     * @Author: lizhouwei
     * @CreateDate: 2018/4/14 23:44
     * @Modify by:
     * @ModifyDate:
     */
    public class Chapter3_14 {
    
        public boolean isPostArray(int[] arr) {
            return isPost(arr, 0, arr.length - 1);
    
        }
    
        public boolean isPost(int[] arr, int start, int end) {
            if (start >= end) {
                return true;
            }
            int value = arr[end];
            int left = -1;
            int right = end;
            for (int i = 0; i < end; i++) {
                if (value > arr[i]) {
                    left = i;//最后一个小于value的位置,一直在变化
                } else {
                    //第一次出现大于value的位置,后面保持不动
                    right = right == end ? i : right;
                }
            }
            //此时,说明在大于value的区间内有小于value的值,不是搜索二叉树树
            if (left != right - 1) {
                return false;
            }
            return isPost(arr, start, left) && isPost(arr, right, end - 1);
        }
    
    
        public Node rebuildBST(int[] arr) {
            return buildBST(arr, 0, arr.length - 1);
        }
    
        public Node buildBST(int[] arr, int start, int end) {
            if (start > end) {
                return null;
            }
            int value = arr[end];
            int left = -1;
            int right = end;
            for (int i = 0; i < end; i++) {
                if (value > arr[i]) {
                    left = i;//最后一个小于value的位置
                } else {
                    //第一次出现大于value的位置,后面保持不动
                    right = right == end ? i : right;
                }
            }
            Node head = new Node(value);
            head.left = buildBST(arr, start, left);
            head.right = buildBST(arr, right, end - 1);
            return head;
        }
    
        //测试
        public static void main(String[] args) {
            Chapter3_14 chapter = new Chapter3_14();
            int[] arr1 = {1, 2, 3, 4, 6, 7, 0, 9, 5};
            boolean res1 = chapter.isPostArray(arr1);
            System.out.println("arr1{1, 2, 3, 4, 6, 7, 0, 9, 5}是否为后序遍历的数组:" + res1);
            int[] arr2 = {1, 2, 3, 4, 6, 7, 8, 9, 5};
            boolean res2 = chapter.isPostArray(arr2);
            System.out.println("arr2{1, 2, 3, 4, 6, 7, 8, 9, 5}是否为后序遍历的数组:" + res2);
            Node head = chapter.rebuildBST(arr2);
            System.out.print("arr2{1, 2, 3, 4, 6, 7, 8, 9, 5}重构搜索二叉树后序打印");
            NodeUtil.postOrder(head);
    
        }
    }
    

    结果

  • 相关阅读:
    如何处理请求返回的二进制数据流转化成xlsx文件?
    iview 表单验证不通过问题?
    如何发布一个npm包?
    async 与 await
    数据库事务的四个基本特征以及事务的隔离级别
    遍历Map的四种方式
    HashMap详解
    HashMap和Hashtable的区别
    java中的堆、栈和常量池简介
    Spring IOC(转载)
  • 原文地址:https://www.cnblogs.com/lizhouwei/p/8845872.html
Copyright © 2011-2022 走看看