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

原创粉丝点击