java实现 重建二叉树

来源:互联网 发布:外商投资网络支付机构 编辑:程序博客网 时间:2024/04/25 02:15
package offer;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;import java.util.Stack;public class ReConstructTree {    //前序遍历结果int p[] = { 1, 2, 4, 7, 3, 5, 6, 8 };//中序遍历结果int d[] = { 4, 7, 2, 1, 5, 3, 8, 6 };//根据前序和中序 重建二叉树public static void main(String[] args) {    ReConstructTree reConstructTree=new ReConstructTree();   TreeNode node=reConstructTree.reConstructTree(0, reConstructTree.p.length-1,0, reConstructTree.d.length-1);    reConstructTree.printTree(node);}TreeNode reConstructTree(int startPIndex, int endPIndex, int startDIndex, int endDindex) {TreeNode head = new TreeNode();head.setData(p[startPIndex]);if (p[startPIndex] == p[endPIndex]) {if (d[startDIndex] == d[endDindex])//当节点数只有一个的时候,四个index两两相等return head;else {//不相等说明输入两个数组数据不一致System.out.println("Invalide Input!!!!!");return null;}}int i;//在中序遍历序列中查找树的头节点的位置for (i = startDIndex; i <= endDindex; i++) {if (p[startPIndex] == d[i])break;}if (i > endDindex) {//在中序遍历中没有找到头节点,数据有误System.out.println("Invalide Input!!!!!");return null;}int leftNums = i - startDIndex;// 左子树 节点个数int rightNums = endDindex - i;// 右子树节点个数if (leftNums > 0) {TreeNode leftHead = reConstructTree(startPIndex + 1, startPIndex + leftNums, startDIndex, i - 1);if (leftHead != null)//左侧树数据head.setTreeLeft(leftHead);}if (rightNums > 0) {TreeNode treeRight = reConstructTree(startPIndex + leftNums + 1, endPIndex, i + 1, endDindex);if (treeRight != null)//右侧树数据head.setTreeRight(treeRight);}return head;}// 把树按照层次打印出来看一看,当节点总数为2的n次方减一的时候,打印一个换行void printTree(TreeNode node) {if (node == null)return;Queue<TreeNode> queue=new LinkedList<>();//使用队列进行打印queue.add(node);int count=0;while(!queue.isEmpty()){TreeNode pop=queue.remove();if(pop!=null){System.out.print(pop.getData());queue.add(pop.getTreeLeft());queue.add(pop.getTreeRight());}elseSystem.out.print("&");//无节点的位置用&代替count++;if(is2nPower(count+1))System.out.println();}}//判断数字n是否是2的n次方boolean is2nPower(int n){String binary=Integer.toBinaryString(n);char c[]=binary.toCharArray();//转化为2进制字符数组,2的n次方的数字除了首位是1其余位都是0for(int i=1;i<c.length;i++){if(c[i]!='0'){return false;}}return true;}}

package offer;public class TreeNode {    int data;TreeNode treeLeft;TreeNode TreeRight;public int getData() {return data;}public void setData(int data) {this.data = data;}public TreeNode getTreeLeft() {return treeLeft;}public void setTreeLeft(TreeNode treeLeft) {this.treeLeft = treeLeft;}public TreeNode getTreeRight() {return TreeRight;}public void setTreeRight(TreeNode treeRight) {TreeRight = treeRight;}}