作为例子的树长这样:

package bstpractice;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

public class BstTest {

public static void main(String args[]){

//step1,先根据中序,后序序列建树

List posOrder = Arrays.asList('B', 'A', 'E', 'D', 'C');

List inOrder = Arrays.asList('A', 'B', 'C', 'D', 'E');

System.out.println("通过");

System.out.println("中序序列:"+inOrder);

System.out.println("后序序列:"+posOrder);

System.out.println("成功构建二叉树,其先序遍历为:");

//建树

MyBinarySearchTree myBST =MyBinarySearchTree.buildTree(inOrder,posOrder);

//先序遍历

// System.out.println("先序遍历结果:");

System.out.println(myBST.preOrder());

System.out.println("高度是:"+myBST.getHigh());

System.out.println("通过其层次遍历:");

System.out.println(myBST.levelOrder());

System.out.println("可知正确");

}

}

package bstpractice;

import sun.reflect.generics.tree.Tree;

import java.util.*;

public class MyBinarySearchTree> {

public TreeNode root;

private int size;

private int high;

private class TreeNode {

TreeNode left;

TreeNode right;

E value;

public TreeNode(E value) {

this.value = value;

}

}

//中序、后序遍历建树方法

public static > MyBinarySearchTree buildTree(List inOrder, List posOrder) {

MyBinarySearchTree tree = new MyBinarySearchTree<>();

tree.size = 0;

tree.root = tree.build(inOrder, posOrder);

return tree;

}

private TreeNode build(List inOrder, List posOrder) {

//边界条件

if (posOrder.isEmpty() || posOrder == null) return null;

//if(inOrder.isEmpty()|| inOrder == null) return null;

E e = posOrder.get(posOrder.size() - 1);//根元素

int index = inOrder.indexOf(e);//得到划分位置和 左子树子序列长度信息,是index!!不是index-1

TreeNode node = new TreeNode(e);

//inOrder(0,index-1);index;(index+1,size-1)

//posOrder(0,0+index-1);(index,size-2);size-1;

//subList【 )!!! subList【 )!!! subList【 )!!! subList【 )!!!

List subLeftInOrder = inOrder.subList(0, index); //实际[0,index-1];

List subLeftPosOrder = posOrder.subList(0, index);

node.left = build(subLeftInOrder, subLeftPosOrder);

List subRightInOrder = inOrder.subList(index + 1, posOrder.size());//可不是size-1 ; size 是树的大小信息...;左闭右开

List subRightPosOrder = posOrder.subList(index, posOrder.size() - 1);

node.right = build(subRightInOrder, subRightPosOrder);

return node;

}

//用栈实现层次遍历,实现方式有多种,就用上课老师讲的反式实现吧;大致思路就是用一个size记录一层的大小,集中手机层次的结点

/* 算法:

1.入栈根结点

2.队列空?

不是:

a.查看队列的大小,记为size;

b.循环控制出队列size个元素

1).出结点并访问(添加到list)

2).出结点有左子树?有左结点入队列

3).出结点有右子树?有右节点入队列

返回回size个元素的Linkedlist到res中

c.回到2

是:返回res列表(List),res的元素是Linkedlist

* */

public List> levelOrder(){

List> res = new ArrayList<>();

if(root == null) return null;

Queue queue = new LinkedList<>(); //queue 必须用LinkedList,才有继承Queue接口

queue.add(root);

while(!queue.isEmpty()){

int count = queue.size();

List oneLevelList = new ArrayList<>();

while(count>0){

TreeNode p = queue.remove();

oneLevelList.add((E) p.value);

count --;

if(p.left!=null) queue.add(p.left);

if(p.right!=null) queue.add(p.right);

}

res.add(oneLevelList);

}

return res;

}

//返回高度的方法

public int getHigh(){

if(root == null) return 0;

return high = high(root);

}

private int high(TreeNode p){ //求树的高度,等于左子树和右子树高度之中较大的那个

int leftH =0;

int rightH =0;

//没有子树了

if(p.left == null && p.right == null){

return 1;

}

//有左子树,递归求左子树给高度

if(p.left !=null) {

leftH = high(p.left)+1;

}

//有右子树,递归求右子树高度

if(p.right != null){

rightH = high(p.right)+1;

}

return leftH >= rightH ? leftH : rightH ;

}

//先实现一个递归先序遍历,NLR

public List preOrder() {

List list = new ArrayList<>();

preOrder(root, list);

return list;

}

private void preOrder(TreeNode scan, List list) {

if (scan == null) return;

list.add((E) scan.value);

preOrder(scan.left, list);

preOrder(scan.right, list);

}

}

在IDEA中运行结果:

注意事项:在实现建树的时候,要记得subList的参数是左闭右开的

来源:https://www.cnblogs.com/debug-the-heart/p/13358374.html

java建树_JAVA实现通过中序遍历和后序遍历序列建树,并求树的高度,用层次遍历做验证...相关推荐

  1. java根据前序和中序建树_Java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)...

    Java实现根据前序遍历构建二叉树(前序遍历.中序遍历.后序遍历),Java关于ACM的代码真的好少,想参考如何用java实现二叉树googl 前言 Java关于ACM的代码真的好少,想参考如何用ja ...

  2. Java实现前序遍历,中序遍历,后序遍历,层序遍历

    1.遍历思想 前序遍历首先访问根节点,然后访问左子树,最后访问右子树. 中序遍历先访问左子树,然后访问根节点,最后访问右子树. 后续遍历先访问左子树,然后访问右子树,最后访问根节点. 层序遍历则是从上 ...

  3. 用Java实现二叉树前序遍历、中序遍历和后序遍历。

    用Java实现二叉树前序遍历.中序遍历和后序遍历. 解析: public class Tree {private int data; /* 数据节点 */private Tree left; /* 左 ...

  4. 二叉树先序遍历、中序遍历、后序遍历 递归和非递归算法

    一.二叉树先序遍历 (1)递归算法 // 递归先序遍历 public static void recursionPreorderTraversal(TreeNode root) {if (root ! ...

  5. 前序遍历,中序遍历,后序遍历详解

    递归时,如果不先print,则是递归调用到最底层之后再print,所以这里我们看到的中序遍历以及后序遍历都是从最底部向上输出的. BST(Binary Search Tree)通常都是和inorder ...

  6. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)

    python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...

  7. 二叉树的前序遍历,中序遍历,后序遍历学习 (原)

    经验: 不要死记各个遍历节点的位置,将一个复杂的二叉树当作一个个小的二叉树学习前序遍历,中序遍历,后序遍历会更容易理解 转载于:https://www.cnblogs.com/gyrgyr/p/962 ...

  8. 已知二叉树的前序遍历、中序遍历或者中序遍历、后序遍历求二叉树结构的算法

    二叉树中的前序遍历是先访问根结点,再访问左子树,右子树. 中序遍历是先访问左子树,再是根结点,最后是右子树. 后序遍历是先访问左子树,再是右子树,最后是根结点. 算法思路是先根据前序遍历的第一个结点或 ...

  9. 根据 中序遍历 和 后序遍历构造树(Presentation)(C++)

    好不容易又到周五了,周末终于可以休息休息了.写这一篇随笔只是心血来潮,下午问了一位朋友PAT考的如何,顺便看一下他考的试题,里面有最后一道题,是关于给出中序遍历和后序遍历然后求一个层次遍历.等等,我找 ...

最新文章

  1. Can't create handler inside thread Thread that has not called Looper.prepare()
  2. Perforce使用之创建DEPOT流程
  3. rabbimq与PHP,PHP初次使用rabbitMQ
  4. /bin/bash^M: bad interpreter: 没有那个文件或目录--转载
  5. JVM类加载机制(ClassLoader)源码解析
  6. 【.NET 遇上 GraphQL】使用 Hot Chocolate 构建 GraphQL 服务
  7. Golang中Goroutine与线程
  8. python语言能做什么游戏好玩_太好玩了我用 Python 制作一款小游戏
  9. “元宇宙”究竟是什么?我用最通俗的大白话给IT人说清楚
  10. sql server 左右连接 内外连接
  11. liunx查询进程下的线程
  12. 支持SMTP邮箱介绍
  13. nginx 与fastcgi通信方式
  14. Interface Project
  15. python编一个答题程序_从0到1使用python开发一个半自动答题小程序的实现
  16. CRM系统客户管理系统源码
  17. Python基础-名片管理
  18. Android系统优化的那些年那些事
  19. 【HTML】人生苦短, 快卷快卷 第二课 HTML 基础
  20. UDIMM和RDIMM内存条区别

热门文章

  1. php自动修图,PS顶级修图插件,专业人像修图只需一键
  2. 谷歌浏览器 设置多账户_使用多个Google帐户时如何设置默认帐户?
  3. 三年级优秀书籍推荐_部编版三年级课外推荐阅读书目-三年级部编版必读书
  4. 轮廓仪 wyko matlab,VEECO光学轮廓仪
  5. 各类木材强度_木材种类
  6. html把div做成透明背景,网页设计div背景透明
  7. 剑三千岛湖服务器是不是维护了,剑网3千岛秘辛成就怎么做 探知千岛湖不为人知的秘密...
  8. 面试时,最忌讳这样自我介绍
  9. 给学妹的 Java 学习路线
  10. (javaweb基础