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());
}
else
System.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其余位都是0
for(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;
}
}