目录

这里右视图类似于立方体的右视图,从右边看每一层第一个看到的结点的集合就是需要返回的结果,注意返回的结点是有相对顺序的,比如上面的1,3,5对应第一层、第二层、第三层结点;返回1,5,3是不对的。
1.这里使用比较直接的方法,先使用先序遍历和中序遍历序列构造二叉树
2.然后对这个二叉树进行层序遍历,对每一层的最后一个结点(每一层的右视图)统计,最后返回
- import java.util.*;
-
- class TreeNode {
- int val = 0;
- TreeNode left = null;
- TreeNode right = null;
- public TreeNode(int val) {
- this.val = val;
- }
- }
-
- public class Solution {
- ArrayList
resArr=new ArrayList<>(); - /**
- * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
- *
- * 求二叉树的右视图
- * @param preOrder int整型一维数组 先序遍历
- * @param inOrder int整型一维数组 中序遍历
- * @return int整型一维数组
- */
- public int[] solve (int[] preOrder, int[] inOrder) {
- //判断是否有值
- if(preOrder.length==0){
- return new int[0];
- }
- TreeNode root=new TreeNode(-1);
- //首先递归构造二叉树
- findMidIdx(root,preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1);
- //然后对二叉树进行层序遍历,得到每一层的最后一个结点值
- bfs(root);
- int[] resInts=new int[resArr.size()];
- for(int i=0;i
- resInts[i]=resArr.get(i);
- }
- return resInts;
- }
- public void findMidIdx(TreeNode root,int[] preOrder,int pstart,int pend, int[] inOrder,int istart,int iend){
- int rootval=preOrder[pstart];
- root.val=rootval;
- if(pstart==pend){
- return;
- }
- int midtargetIndex=0;
- for(int i=istart;i<=iend;i++){
- if(inOrder[i]==rootval){
- midtargetIndex=i;
- break;
- }
- }
- int leftsize=midtargetIndex-istart;
- int rightsize=iend-midtargetIndex;
- if(leftsize==0){//剩余全是右子树
- TreeNode rightnode=new TreeNode(-1);
- root.right=rightnode;
- findMidIdx(root.right,preOrder,pstart+1,pend,inOrder,istart+1,iend);
- }else if(midtargetIndex==iend){//剩余全是左子树
- TreeNode leftnode=new TreeNode(-1);
- root.left=leftnode;
- findMidIdx(leftnode,preOrder,pstart+1,pend,inOrder,istart,iend-1);
- }else{
- //对左子树部分
- TreeNode leftnode=new TreeNode(-1);
- root.left=leftnode;
- findMidIdx(leftnode,preOrder,pstart+1,pstart+leftsize,inOrder,istart,midtargetIndex-1);
- //对右子树部分
- TreeNode rightnode=new TreeNode(-1);
- root.right=rightnode;
- findMidIdx(rightnode,preOrder,pend-rightsize+1,pend,inOrder,midtargetIndex+1,iend);
- }
- }
- //使用队列实现层序遍历
- public void bfs(TreeNode root){
- Deque
nodeque=new LinkedList<>(); - nodeque.offer(root);
- int lastlayernodenum=1;
- int nowlayernode=0;
- while(!nodeque.isEmpty()){
- TreeNode nownode=nodeque.poll();
- lastlayernodenum--;
- if(nownode.left!=null){
- nodeque.offer(nownode.left);
- nowlayernode++;
- }
- if(nownode.right!=null){
- nodeque.offer(nownode.right);
- nowlayernode++;
- }
- if(lastlayernodenum==0){
- resArr.add(nownode.val);
- lastlayernodenum=nowlayernode;
- nowlayernode=0;
- }
- }
- }
- }
四、刷题链接