面试必考真题-算法篇 牛客网
树
题目描述
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
题目分析:
首先利用二叉树的前序和中序遍历结果重建该二叉树,之后利用层次遍历,找到每层最右侧的节点,同时将其加入ArrayList中,最后转换为int数组即可。
下面是Java代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 求二叉树的右视图
* @param xianxu int整型一维数组 先序遍历
* @param zhongxu int整型一维数组 中序遍历
* @return int整型一维数组
*/
public int[] solve (int[] xianxu, int[] zhongxu) {
// write code here
ArrayList<Integer> list = new ArrayList<>();
if(xianxu == null|| xianxu.length == 0){
return new int[0];
}
TreeNode head = rebuild(xianxu,zhongxu);
//利用层次遍历,找到每层最右侧节点,并加入list。
Queue<TreeNode> q = new LinkedList<>();
q.offer(head);
int count = 0 , nextCount = 1;
int value = 0;
while(!q.isEmpty()){
TreeNode tmp = q.poll();
++count;
value = tmp.val;
if(tmp.left!=null){
q.offer(tmp.left);
}
if(tmp.right!=null){
q.offer(tmp.right);
}
if(count == nextCount){
count = 0 ;
nextCount = q.size();
list.add(value);
}
}
int[] res = new int[list.size()];
for(int i = 0;i < list.size() ;i++){
res[i] = list.get(i);
}
return res;
}
//利用二叉树前序和中序重建二叉树。
private TreeNode rebuild(int[] xianxu, int[] zhongxu){
if(xianxu == null|| xianxu.length == 0){
return null;
}
TreeNode head = new TreeNode(xianxu[0]);
int flag = 0;
for(int i = 0 ; i < xianxu.length ; i++){
if(xianxu[0] == zhongxu[i]){
flag = i;
break;
}
}
head.left = rebuild(Arrays.copyOfRange(xianxu,1,flag+1),Arrays.copyOfRange(zhongxu,0,flag));
head.right = rebuild(Arrays.copyOfRange(xianxu,flag+1,xianxu.length),Arrays.copyOfRange(zhongxu,flag+1,zhongxu.length));
return head;
}
}