java先序中序建立二叉树的递归算法
来源:互联网 发布:天龙八部减抗雕文数据 编辑:程序博客网 时间:2024/05/02 19:21
在网上找了很多知道先序中序建立二叉树的例子,但是看不懂,所以自己耐心写了一个,并附有详细的注释。
首先描述一下大致的算法例如:
先序 e,a,c,b,d,g,f
中序 a,b,c,d,e,f,g
先序的第一个节点e,就是头节点,所以中序中e的左半部分单独当做一个二叉树处理,右半部分一样,即:
(a,b,c,d),e,(f,g)
右半部分(a,b,c,d)在先序是a,c,b,d
左半部分(f,g)的先序是g,f
我们可以得出左半部分的头结点a,就是e的左节点;找出右半部分的头结点g就是右节点。
再找a的左节点和右节点就是一个递归了。以下直接贴代码
/** *二叉树建模 **/public class MyBinaryTree<U>{static class Node<T>{Node left;Node right;T val;public Node(T val){this.val = val;}}private U[] preOrder = null;private U[] inOrder = null;private U[] sufOrder = null;public U[] getPreOrder() {return preOrder;}public void setPreOrder(U[] preOrder) {this.preOrder = preOrder;}public U[] getInOrder() {return inOrder;}public void setInOrder(U[] inOrder) {this.inOrder = inOrder;}public U[] getSufOrder() {return sufOrder;}public void setSufOrder(U[] sufOrder) {this.sufOrder = sufOrder;}/** *根据二叉树先序和中序建立二叉树模型,返回头结点 *@param preOrder 先序数组 *@param big1 先序中需要建立二叉树的部分的起始位置 *@param end1 先序中需要建立二叉树的部分的最终位置 *@param inOrder 中序数组 *@param big2 中序中需要建立二叉树的部分的起始位置 *@param end2 中序中需要建立二叉树的部分的最终位置 *如:先序{1,3,4,6,8,9,0,2} big1为2,end1为5 *中序{1,5,7,6,8,4,9}big2为3,end2为6 *保证需要建立二叉树的先序部分里和中序部分,它们的组成节点是一样的。 **/public Node getTreePreOrderInOrder(U[] preOrder,int big1,int end1,U[] inOrder,int big2,int end2){if(big1>end1||big2>end2) return null;Node<U> head = new Node<U>(preOrder[big1]);int index = 0;//头节点(头结点指的是big1到end1范围内的节点的头节点)在中序big2到end2之间所处的位置for(int i=big2; i<end2 ; i++){U in = inOrder[i];if(in.equals(preOrder[big1])){ break;}else{index ++;}}//计算建立左节点的节点范围int leftBig1 = big1+1;//先序的起始位置int leftEnd1 = big1+index;//先序的最终位置int leftBig2 = big2;//中序的起始位置int leftEnd2 = big2+index-1;//中序的最终位置//计算建立右节点的节点范围int rightBig1 = big1+index+1;//先序的起始位置int rightEnd1 = end1;//先序的最终位置int rightBig2 = big2+index+1;//中序的起始位置int rightEnd2 = end2;//中序的最终位置//左节点Node<U> leftNode = getTreePreOrderInOrder(preOrder, leftBig1,leftEnd1,inOrder,leftBig2,leftEnd2);//右节点Node<U> rightNode = getTreePreOrderInOrder(preOrder, rightBig1,rightEnd1,inOrder, rightBig2,rightEnd2);head.left = leftNode;head.right = rightNode;return head;}public void preNode(Node head){if(head!=null){System.out.print(head.val.toString()+",");preNode(head.left);preNode(head.right);}}public void inOrder(Node head){if(head!=null){inOrder(head.left);System.out.print(head.val.toString()+",");inOrder(head.right);}}public void printTree(Node<U> head){}public static void main(String srgd[]){String preOrder[] = {"e","a","c","b","d","g","f"};String inOrder[] = {"a","b","c","d","e","f","g"};MyBinaryTree<String> tree = new MyBinaryTree<String>();Node head = tree.getTreePreOrderInOrder(preOrder, 0, preOrder.length-1, inOrder, 0, inOrder.length-1);tree.preNode(head);System.out.println();tree.inOrder(head);}}
- java先序中序建立二叉树的递归算法
- 先序中序建立二叉树的递归算法
- 二叉树的递归建立
- 二叉树的递归建立
- 二叉树的递归建立
- 建立二叉树,实现二叉树的先序,中序遍历的递归算法
- 【IT笔试面试题整理】给定二叉树先序中序,建立二叉树的递归算法
- 递归建立二叉树
- 递归建立二叉树
- 二叉树的建立及递归遍历
- 递归二叉树的建立于遍历
- 二叉树的非递归建立
- 二叉树的非递归建立
- 二叉树的建立及递归遍历
- 二叉树的建立及递归遍历
- 二叉树的递归建立与应用
- 二叉树的递归建立和遍历
- 二叉树的递归算法
- Ubuntu11.04更新源(转)
- hdu 4006 The kth great number(优先队列)
- LeetCode-Path Sum
- SpringMVC+mybatis+DWR3注解
- 【xinfanqie】笔者分享:教你如何快速关闭磁盘索引
- java先序中序建立二叉树的递归算法
- android ndk 下载地址
- Loaders初步学习
- 13年 8 月16
- velocity与struts2
- Swing组件重定位
- Struts 、 spring 、 Hibernate 在各层的作用
- GridView 绑定列表
- .png在IE6中显示的效果处理