题解 | 重建二叉树
重建二叉树
https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6
import java.util.*;
/*
* public class TreeNode {
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
* public TreeNode(int val) {
* this.val = val;
* }
* }
*/
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param preOrder int整型一维数组
* @param vinOrder int整型一维数组
* @return TreeNode类
*/
public TreeNode reConstructBinaryTree (int[] preOrder, int[] vinOrder) {
// write code here
return dfs(preOrder,0,preOrder.length-1,vinOrder,0,vinOrder.length-1);
}
public TreeNode dfs(int[]preOrder,int leftPre,int rightPre,
int[]vinOrder,int leftVin,int rightVin){
if(leftPre>rightPre||leftVin>rightVin)return null;
int rootVal=preOrder[leftPre];
TreeNode root=new TreeNode(rootVal);
int limiter=leftVin;
while(vinOrder[limiter]!=rootVal){
limiter++;
}
root.left=dfs(preOrder,leftPre+1,limiter-leftVin+leftPre,
vinOrder,leftVin,limiter-1);
root.right=dfs(preOrder,limiter-leftVin+leftPre+1,rightPre,
vinOrder,limiter+1,rightVin);
return root;
}
}
前序的第一个值一定是rootval。
根据rootval找到中序的根节点:
int limiter=leftVin;
while(vinOrder[limiter]!=rootVal){
limiter++;
}
把中序分割成左右两个子树:
左子树:leftVin,limiter-1
右子树:limiter+1,rightVin
然后把前序分割成两个子树(设x为左子树的最后一个节点对应的下表):
左子树:leftPre+1,x
右子树:x+1,rightPre
根据前序和中序遍历时左右子树的节点数量一致可得:
x-leftPre-1=limiter-1-leftVin
故:x=limiter-leftVin+leftPre
最后递归创建左右子树:
root.left=dfs(preOrder,leftPre+1,limiter-leftVin+leftPre,
vinOrder,leftVin,limiter-1);
root.right=dfs(preOrder,limiter-leftVin+leftPre+1,rightPre,
vinOrder,limiter+1,rightVin);
查看10道真题和解析
