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);
    
        }
    }
    

    结果

  • 相关阅读:
    Extjs4循序渐进(二)——Ext的界面(容器和布局)
    Extjs4循序渐进(一)——开始Ext
    重写jQuery的$字符
    WinForm窗口基础配置
    C# 遍历文件夹图片并用ListView控件展示
    Extjs4循序渐进(三)——表单及表单控件详解一(表单布局和基础控件 Text,TextArea,Number,Checkbox,Radio,Date)
    【ezj】一款国产JavaScript 框架,使用体验
    使用Java语言实现几种常见的排序算法
    http://www4.it168.com/jtzt/shenlan/tech/netdesignp/
    写在前面的话
  • 原文地址:https://www.cnblogs.com/lizhouwei/p/8845872.html
Copyright © 2011-2022 走看看