Java实现由前序序列和中序序列重建二叉树,并后序输出。
2014-08-04 16:27
483 查看
具体实现采用递归方式,也可采用桟来模拟递归实现(读者可自己实现)。
/** * 得知二叉树前序序列 中序序列构建二叉树 并后序输出 * @author gengtao * */ /** * 使用java中的类来模拟 结构体(c/c++ struct) * */ class BinaryTree{ int value; BinaryTree left; BinaryTree right; } public class train0804 { public static void main(String[] args) { // TODO Auto-generated method stub int[] preList = new int[]{1,2,4,7,3,5,6,8}; int[] inList = new int[]{4,7,2,1,5,3,8,6}; // int[] preList = new int[]{1,2,4,7}; // int[] inList = new int[]{4,7,2,1}; PostOrder(Construct(preList, inList, 8)); } //构建二叉树 public static BinaryTree Construct(int[] preList , int[] inList , int length){ if(preList == null || inList == null || length <= 0){ return null; } return ConstructCore(preList , 0 , preList.length - 1 , inList , 0 , inList.length - 1 , length); } /** * * @param preList 前序数组 * @param preStart 前序索引起始位置 * @param preEnd 前序索引终止位置 * @param inList 中序数组 * @param inStart 中序索引起始位置 * @param inEnd 中序索引终止位置 * @param length 数组总长度 * @return */ public static BinaryTree ConstructCore(int[] preList , int preStart , int preEnd, int[] inList , int inStart , int inEnd , int length) { //System.out.println(preStart+"==="+preEnd+" "+inStart +"==========="+inEnd); int rootValue = preList[preStart]; //System.out.println(rootValue); BinaryTree root = new BinaryTree(); root.value = rootValue; root.left = root.right = null; if(preStart >= length || preEnd >= length || inStart >= length || inEnd >= length){ return null; } if(preList[preStart] == preList[preEnd]){ if(inList[inStart] == inList[inEnd]){ return root; }else{ System.out.println("Invalid input."); } } //在中序遍历中找到根节点的值 int rootInorder = inStart; while(rootInorder <= inEnd && inList[rootInorder] != rootValue){ rootInorder ++; } if(rootInorder == inEnd && inList[rootInorder] != rootValue){ System.out.println("Invalid input."); } int leftLength = rootInorder - inStart; int leftPreorderEnd = preStart + leftLength; //构建左子树 if(leftLength > 0){ root.left = ConstructCore(preList, preStart + 1, leftPreorderEnd, inList, inStart, rootInorder - 1 , length); } //构建右子树 if(leftLength < preEnd - preStart){ root.right = ConstructCore(preList, leftPreorderEnd + 1, preEnd, inList, rootInorder + 1, inEnd , length); } return root; } //后序遍历二叉树 public static void PostOrder(BinaryTree bt){ if(bt != null){ PostOrder(bt.left); PostOrder(bt.right); System.out.print(bt.value + " "); } } }
相关文章推荐
- 通过前序遍历和中序遍历重建二叉树以及输出后序遍历(Java实现)(二)
- 数据结构与算法分析笔记与总结(java实现)--二叉树20:二叉搜索树的后序遍历序列
- 通过前序遍历和中序遍历重建二叉树以及输出后序遍历(Java实现)
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归)
- 先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 二叉树的前序、中序、后序(递归、非递归)遍历java实现
- 剑指offer--面试题6:重建二叉树--Java实现
- 从层序中序重建二叉树输出先序后序
- 输入一个正数 n,输出所有和为 n 连续正数序列。 java实现
- 根据前序遍历(或者是后序遍历)和中序遍历得到的序列可以重建二叉树
- Java实现 输出 任意两个数之间的斐波那契序列
- 剑指offer--面试题24:二叉搜索树的后序遍历序列--Java实现
- 二叉树后序遍历的循环实现(JAVA)
- java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)
- Java迭代实现二叉树的前序、中序、后序遍历
- Python练手之根据前序和中序&根据中序和后序重建二叉树,输出前序、中序和后序遍历结果
- c/c++实现利用二叉树的先序遍历和中序遍历序列重建树
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
- java实现——006重建二叉树
- java实现二叉树的三种遍历方式,并把二叉树转为双向链表,输出二叉树