-
在java中如何存储一颗二叉树树呢,显然不能直接画上去对吧(滑稽) ,一般情况我们可以将先,中序的遍历结果风别用两个数组存储,在使用的时候将二叉树还原出来。但是如何还原出来呢?往下看…
在知道先序和中序遍历的原理之后,我们便可以反推出一颗树。思路:
- 1)先序遍历的第一位即是二叉树的根节点。
- 2)然后再中序遍历找到根结点,根节点左边的所有序列便是左子树的中序遍历结果,右边的所有序列便是右子树中序遍历结果。
- 3)在先序遍历中找到对应的左子树,右子树。
- 4)在左右子树的先序和中序结果中继续重复1 , 2 ,3步骤,便可还原二叉树。
- 如下图:
具体代码实现:
/**
* 二叉树结点
*/
public class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
public TreeNode(int val) {
this.val = val;
}
}
public static int findRootIndex(int[] arr, int val){
for(int i = 0; i < arr.length; i++){
if(arr[i] == val) return i;
}
return -1;
}
/**
* 根据先序和中序还原二叉树
*/
public static TreeNode buildTree(int[] fst, int[] mid){
if(fst == null || mid == null || fst.length == 0 || mid.length == 0 || fst.length != mid.length)return null;
//从前序遍历中找到根结点
TreeNode root = new TreeNode(fst[0]);
//在中序遍历中,找到根节点的位置索引
int rootIndex = findRootIndex(mid,root.val);
//找到左子树的前序和中序
int[] leftFst = Arrays.copyOfRange(fst,1,rootIndex+1);
int[] leftMid = Arrays.copyOfRange(mid,0,rootIndex);
//找到右子树的前序和中序
int[] rightFst = Arrays.copyOfRange(fst,rootIndex+1,fst.length);
int[] rightMid = Arrays.copyOfRange(mid,rootIndex+1,mid.length);
//递归,构建左右子树
TreeNode left = buildTree(leftFst,leftMid);
TreeNode right = buildTree(rightFst,rightMid);
//将左右子树添加到当前的根节点
root.left = left;
root.right = right;
return root;
}
public class Main {
public static void main(String[] args) {
int[] fst = new int[]{1,2,4,5,3,6};//先序遍历结果
int[] mid = new int[]{4,2,5,1,3,6};//中序遍历结果
TreeNode root = buildTree(fst,mid);
System.out.println(root);//debug查看
//System.out.println(root.val);
}
查看还原结果:
还原成功~