• 二叉树-输出二叉树的右视图


    目录

    一、问题描述

    二、解题思路

    三、代码实现

    四、刷题链接


    一、问题描述

    二、解题思路

    这里右视图类似于立方体的右视图,从右边看每一层第一个看到的结点的集合就是需要返回的结果,注意返回的结点是有相对顺序的,比如上面的1,3,5对应第一层、第二层、第三层结点;返回1,5,3是不对的。

    1.这里使用比较直接的方法,先使用先序遍历和中序遍历序列构造二叉树

    2.然后对这个二叉树进行层序遍历,对每一层的最后一个结点(每一层的右视图)统计,最后返回

    三、代码实现

    1. import java.util.*;
    2. class TreeNode {
    3. int val = 0;
    4. TreeNode left = null;
    5. TreeNode right = null;
    6. public TreeNode(int val) {
    7. this.val = val;
    8. }
    9. }
    10. public class Solution {
    11. ArrayList resArr=new ArrayList<>();
    12. /**
    13. * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
    14. *
    15. * 求二叉树的右视图
    16. * @param preOrder int整型一维数组 先序遍历
    17. * @param inOrder int整型一维数组 中序遍历
    18. * @return int整型一维数组
    19. */
    20. public int[] solve (int[] preOrder, int[] inOrder) {
    21. //判断是否有值
    22. if(preOrder.length==0){
    23. return new int[0];
    24. }
    25. TreeNode root=new TreeNode(-1);
    26. //首先递归构造二叉树
    27. findMidIdx(root,preOrder,0,preOrder.length-1,inOrder,0,inOrder.length-1);
    28. //然后对二叉树进行层序遍历,得到每一层的最后一个结点值
    29. bfs(root);
    30. int[] resInts=new int[resArr.size()];
    31. for(int i=0;i
    32. resInts[i]=resArr.get(i);
    33. }
    34. return resInts;
    35. }
    36. public void findMidIdx(TreeNode root,int[] preOrder,int pstart,int pend, int[] inOrder,int istart,int iend){
    37. int rootval=preOrder[pstart];
    38. root.val=rootval;
    39. if(pstart==pend){
    40. return;
    41. }
    42. int midtargetIndex=0;
    43. for(int i=istart;i<=iend;i++){
    44. if(inOrder[i]==rootval){
    45. midtargetIndex=i;
    46. break;
    47. }
    48. }
    49. int leftsize=midtargetIndex-istart;
    50. int rightsize=iend-midtargetIndex;
    51. if(leftsize==0){//剩余全是右子树
    52. TreeNode rightnode=new TreeNode(-1);
    53. root.right=rightnode;
    54. findMidIdx(root.right,preOrder,pstart+1,pend,inOrder,istart+1,iend);
    55. }else if(midtargetIndex==iend){//剩余全是左子树
    56. TreeNode leftnode=new TreeNode(-1);
    57. root.left=leftnode;
    58. findMidIdx(leftnode,preOrder,pstart+1,pend,inOrder,istart,iend-1);
    59. }else{
    60. //对左子树部分
    61. TreeNode leftnode=new TreeNode(-1);
    62. root.left=leftnode;
    63. findMidIdx(leftnode,preOrder,pstart+1,pstart+leftsize,inOrder,istart,midtargetIndex-1);
    64. //对右子树部分
    65. TreeNode rightnode=new TreeNode(-1);
    66. root.right=rightnode;
    67. findMidIdx(rightnode,preOrder,pend-rightsize+1,pend,inOrder,midtargetIndex+1,iend);
    68. }
    69. }
    70. //使用队列实现层序遍历
    71. public void bfs(TreeNode root){
    72. Deque nodeque=new LinkedList<>();
    73. nodeque.offer(root);
    74. int lastlayernodenum=1;
    75. int nowlayernode=0;
    76. while(!nodeque.isEmpty()){
    77. TreeNode nownode=nodeque.poll();
    78. lastlayernodenum--;
    79. if(nownode.left!=null){
    80. nodeque.offer(nownode.left);
    81. nowlayernode++;
    82. }
    83. if(nownode.right!=null){
    84. nodeque.offer(nownode.right);
    85. nowlayernode++;
    86. }
    87. if(lastlayernodenum==0){
    88. resArr.add(nownode.val);
    89. lastlayernodenum=nowlayernode;
    90. nowlayernode=0;
    91. }
    92. }
    93. }
    94. }

    四、刷题链接

    输出二叉树的右视图_牛客题霸_牛客网

  • 相关阅读:
    (C++进阶)使用Eigen库进行多项式曲线拟合
    【rust/egui】(十一)使用rfd选择文件并使用serde_json进行序列化
    广义线性混合模型(GLMM)变量选择
    数据可视化——pyecharts库绘图
    Open3D学习笔记
    Dom.nodeType
    牛客网SQL大厂真题—SQL158:每类视频近一个月的转发量/率
    【Mysql系列】(一)MySQL语句执行流程
    Java面试题-Java核心基础-第十三天(序列化)
    springCloud bean的加载流程
  • 原文地址:https://blog.csdn.net/hehe_soft_engineer/article/details/139833937