//分两步,第一步重建二叉树,第二步,层序遍历二叉树,取每一层最右边的节点即为右视图
public int[] solve (int[] xianxu, int[] zhongxu) {
// write code here
TreeNode root = reBuild(xianxu,0,xianxu.length-1,zhongxu,0,
zhongxu.length-1);
int[] res = cenxu(root);
return res;
}
private int[] cenxu(TreeNode root){
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
List<Integer> res = new ArrayList<>();
while(queue.size()>0){
int len = queue.size();
for(int i=1;i<=len;i++){
TreeNode tn = queue.poll();
if(tn.left!=null) queue.add(tn.left);
if(tn.right!=null) queue.add(tn.right);
if(i==len) res.add(tn.val);
}
}
int[] r = new int[res.size()];
int y = 0;
for(int a:res){
r[y++] = a;
}
return r;
}
private TreeNode reBuild(int[] xianxu,int xbegin,int xend,int[] zhongxu,
int zbegin,int zend){
if(xbegin>xend || zbegin > zend) return null;
if(xbegin==xend) return new TreeNode(xianxu[xbegin]);
int temp = xianxu[xbegin];
int index = 0;
for(int i=zbegin;i<=zend;i++){
if(zhongxu[i]==temp){
index = i;
break;
}
}
//zhongxu zbegin - index-1 index+1 - zend
//xianxu xbegin+1 - xbegin+index-zbegin xbegin+index-zbegin+1-- xend
TreeNode left = reBuild(xianxu,xbegin+1,xbegin+index-zbegin,zhongxu,zbegin,index-1);
TreeNode right = reBuild(xianxu,xbegin+index-zbegin+1,xend,zhongxu,index+1,zend);
TreeNode root = new TreeNode(temp);
root.left = left;
root.right = right;
return root;
}
京公网安备 11010502036488号