由先序序列和中序序列可以唯一的确定一棵二叉树。
过程如下:
(1)根据先序序列确定树的根节点。
(2)根据根节点在中序序列中划分出二叉树的左、右子树包含哪些结点。然后根据左、右子树结点在先序
序列中的次序可以确定子树的根结点。
重复上述步骤,直到每棵子树仅有一个结点为止。
![]()
思路1
public TreeNode PreInCreate(int[] pre, int[] in, int startPre, int endPre, int startIn, int endIn) { // 先对pre和in进行判断 if (pre == null || in == null) return null; TreeNode root = new TreeNode(pre[startPre]); // 建立每一棵子树的根结点 // 根结点在中序序列中的划分 int i = 0; for (i = startIn; i<= endIn; i++) { if (in[i] == root.val) { break; } } int leftTreeLen = i - startIn; // 左子树的长度 int rightTreeLen = endIn - i; // 右子树的长度 if (leftTreeLen != 0) { // 如果存在左子树,递归建立左子树 root.left = PreInCreate(pre, in, startPre+1, startPre+leftTreeLen, startIn, startIn+leftTreeLen-1); } else { root.left = null; // 左子树置为空 } if (rightTreeLen != 0) { root.right = PreInCreate(pre, in, endPre-rightTreeLen+1, endPre, endIn-rightTreeLen+1, endIn); } else { root.right = null; } return root; } public TreeNode reConstructBinaryTree(int[] pre, int[] in) { int startPre = 0; int startIn = 0; int endPre = pre.length - 1; int endIn = in.length - 1; return PreInCreate(pre, in, startPre, endPre, startIn, endIn); }
思路2
public class Solution { public TreeNode reConstructBinaryTree(int [] pre,int [] in) { TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1); return root; } //前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6} private TreeNode reConstructBinaryTree(int [] pre,int startPre,int endPre,int [] in,int startIn,int endIn) { if(startPre>endPre||startIn>endIn) return null; TreeNode root=new TreeNode(pre[startPre]); for(int i=startIn;i<=endIn;i++) if(in[i]==pre[startPre]){ root.left=reConstructBinaryTree(pre,startPre+1,startPre+i-startIn,in,startIn,i-1); root.right=reConstructBinaryTree(pre,i-startIn+startPre+1,endPre,in,i+1,endIn); break; } return root; } }