输出二叉树的右视图
描述
请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图
示例1
输入:
[1,2,4,5,3],[4,2,5,1,3]
返回值:
[1,3,5]
其实现主要包括两个部分
1、二叉树重构函数
static TreeNode recontruNode(int[] xianxu, int[] zhongxu){
if(xianxu.length == 0 || zhongxu.length == 0){
return null;
}
//设置根节点
TreeNode root = new TreeNode(xianxu[0]);
//找到index的下标,即在中序遍历中找到根节点的下表并返回
int index = findlocation(xianxu,zhongxu);
//设置左子树的数组
root.left = recontruNode(Arrays.copyOfRange(xianxu,1,index+1),Arrays.copyOfRange(zhongxu,0,index));
//设置右子树的数组
root.right = recontruNode(Arrays.copyOfRange(xianxu,index+1,xianxu.length),Arrays.copyOfRange(zhongxu,index+1,zhongxu.length));
return root;
}
//查找根节点的下标数值
static int findlocation(int[] xianxu, int[] zhongxu){
for(int i = 0;i<zhongxu.length;i++){
if(zhongxu[i] == xianxu[0]){
return i;
}
}
return 0;
}
2、进行层序遍历输出最右侧的元素
//打印右视图
static List<Integer> trans(TreeNode recontructer){
Queue<TreeNode> queue = new LinkedList<TreeNode>();
if(recontructer != null){
queue.add(recontructer);//如果加入数列
}
while(!queue.isEmpty()){
TreeNode node = null;
//这里的size表示的是每一层的元素个数
//比如第一层遍历的时候只有一个1,在结束for循环后便结束;
//然后进行下一层的遍历
//在有2,3元素是通过对于2的遍历引入2的左右子树,
for(int i = queue.size();i>0;i--){
node = queue.poll();
if(node.left != null){
queue.add(node.left);
}
if(node.right != null){
queue.add(node.right);
}
}
//每层都是在这进行终结
list.add(node.val);
}
return list;
}
3、主函数
public int[] solve (int[] xianxu, int[] zhongxu) {
// write code here
if(xianxu.length == 0 || zhongxu.length == 0){
return new int[0];
}
//重构二叉树函数接收
TreeNode recontructer = recontruNode(xianxu,zhongxu);
//打印二叉树的右视图
List<Integer> res = trans(recontructer);
int[] result = new int[res.size()];
for(int i = 0;i<list.size();i++){
result[i] = res.get(i);
}
return result;
}