根据前序遍历和后续遍历建立二叉树
来源:互联网 发布:linux php5.6编译参数 编辑:程序博客网 时间:2024/05/01 15:42
前序遍历结果:1,2,4,9,7,3,5,6,8(根,左,右)
中序遍历结果:9,4,7,2,1,5,3,8,6(左,根,右)
前序遍历是先遍历根节点;中序遍历是先遍历左节点,再遍历根节点,最后是遍历右节点。可见在中序遍历当中,通过根节点将数组分为左右两部分,而根节点可以通过前序遍历中找到。如果根节点没有左右孩子,则可以直接返回给上一个节点,如果有递归划分。
比如:通过根节点1,将中序结果划分为(9,4,7,2)和(5,3,8,6),接着遍历前序下一个节点2,对(9,4,7,2)进行划分(9,4,7)和(),接着…..
具体代码如下:
BinartTree.java
package com.xll.binaryTree;public class BinaryTree { /**记录遍历到前缀遍历结果数组的位置*/ private int pre = 0; /**树的根节点*/ private Node root = null; private int[] preR = null; private int[] midR = null; public BinaryTree(){ } /** *通过前序遍历和中序遍历结果构建二叉树 * *@param preR 前缀遍历结果 *@param midR 后缀遍历结果 */ public void constructTree(int[] preR , int[] midR){ this.preR = preR; this.midR = midR; if(preR == null || midR == null){ System.out.println("前序结果或中序结果有问题"); return; } else if(preR.length > midR.length || midR.length > preR.length){ System.out.println("长度不一致"); return; } root = constructTreeCore(0 , midR.length - 1); } /** *重构二叉树核心代码块,是从左到右至下而上构建 *比如前缀遍历结果是:1,2,4,7,3,5,6,8, *先构建完7左右孩子,在构建4左右孩子...到1, *这时已经构建完根节点1的左子树了,构建右子树 *原理一样 * *@param midStart 数组midR下标(起始) *@param midEnd 数组midR下标(结束) */ public Node constructTreeCore(int midStart , int midEnd){ int rootValue = preR[pre]; int sepIndex = 0; //根节点在中序遍历中位置 Node root = new Node(); root.data = rootValue; root.leftNode = root.rightNode = null; for(int i = midStart ; i <= midEnd ; i++){ if(midR[i] == rootValue){ sepIndex = i; break; } } if(midStart == midEnd){ return root; } if((sepIndex - 1 - midStart) >= 0){ ++pre; root.leftNode = constructTreeCore(midStart , sepIndex - 1); } if(sepIndex + 1 <= midEnd){ ++pre; root.rightNode = constructTreeCore(sepIndex + 1 , midEnd); } return root; }}
Node.java
package com.xll.binaryTree;public class Node { public int data; public Node leftNode; public Node rightNode; public Node(int data){ this.data = data; this.leftNode = null; this.rightNode = null; } public Node(){ }}
Main.java
package com.xll.binaryTree;public class Main { public static void main(String[] args){ BinaryTree bt = new BinaryTree(); int[] preR = new int[]{1 , 2 , 4 , 9 , 7 , 3 , 5 , 6 , 8}; int[] midR = new int[]{9 , 4 , 7 , 2 , 1 , 5 , 3 , 8 , 6}; bt.constructTree(preR, midR); }}
0 0
- 根据前序遍历和后续遍历建立二叉树
- 编程实现二叉树的建立,前序遍历,中序遍历和后续遍历
- 【二叉树1】根据前序和中序遍历建立一棵二叉树
- 二叉树--已知前序遍历和中序遍历,输出后续遍历
- 由前序遍历和中序遍历重建二叉树,再实现后续遍历
- 树-根据前序、中序遍历求后续遍历
- 根据前序和中序遍历的结果建立二叉树
- 根据先序遍历和后续遍历重构二叉树
- 第六章 遍历二叉树及推导遍历结果(前序、中序和后续)
- 由二叉树的前序遍历和后续遍历结果还原二叉树,并后序遍历打印
- C++编程练习(8)----“二叉树的建立以及二叉树的三种遍历方式“(前序遍历、中序遍历、后续遍历)
- c++ 二叉树的构建 前序遍历 中序遍历 后续遍历 层次遍历
- 【二叉树】根据二叉树的中序遍历和前序遍历,还原二叉树
- 根据前序和中序遍历构造二叉树
- 根据前序和中序遍历构造二叉树
- 根据中序和前序遍历重建二叉树
- 根据中序和前序遍历构建二叉树
- 根据前序和中序遍历重建二叉树
- subplot函数用法(MATLAB)
- 【转】将图集切割成单个单个的图片
- 怎样新学一门技术
- JAVA学习摘记
- Curl 常用命令示例
- 根据前序遍历和后续遍历建立二叉树
- 前台RelativeLayout xmlns 线性布局 onCreate方法代码
- 百度上传控件webUPload 的使用
- SAP 结账流程
- 图片的压缩
- Linux内核地址映射模型-高端内存
- linux下tomcat启动 8080被占用
- Qt—遍历文件夹以及过滤文件
- SAP CK40N常见问题