题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
二叉树节点定义:
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
-
解法一
- 千篇一律的递归,很简单:
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre==null || pre.length==0)return null;
return rebuild(pre, 0, pre.length-1, in, 0, in.length-1);
}
private TreeNode rebuild(int[] pre, int start1, int end1, int[] in, int start2, int end2){
if(start1>end1 || start2>end2)return null;
TreeNode root = new TreeNode(pre[start1]);
for(int i=start2; i<=end2; i++){
if(in[i] == pre[start1]){
root.left = rebuild(pre, start1+1, start1+i-start2, in, start2, i-1);
root.right = rebuild(pre, start1+i-start2+1, end1, in, i+1, end2);
break;
}
}
return root;
}
}
-
解法二
- 非递归的方式,借助栈实现,想不起来是咋做的了,晦涩难懂
import java.util.LinkedList;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre==null || pre.length==0)return null;
LinkedList<TreeNode> stack = new LinkedList<TreeNode>();
TreeNode root = new TreeNode(pre[0]);
stack.addFirst(root);
TreeNode cur;
int i=1, j=0;
while(i < pre.length){
cur = stack.getFirst();
if(cur.val != in[j]){
cur.left = new TreeNode(pre[i++]);
cur = cur.left;
stack.addFirst(cur);
} else{
stack.removeFirst();
j++;
if(stack.size()==0 || stack.getFirst().val!=in[j]){
cur.right = new TreeNode(pre[i++]);
cur = cur.right;
stack.addFirst(cur);
}
}
}
return root;
}
}