zoukankan      html  css  js  c++  java
  • 二叉树的右视图

    这道题其实本身没有什么难度,就是层序遍历保留每一层最后一个值。但是以什么方式来区分每一层还是有不同思路的。

    public static List<Integer> rightSideView(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
            //偶数层节点数目
            int evenNodeNum = 0;
            //奇数层节点数目
            int oddNodeNum = 0;
            //当前是奇数层还是偶数层 true表示奇数层
            boolean flag = true;
            Queue<TreeNode> queue = new ArrayDeque<>();
            List<Integer> list = new ArrayList<>();
            queue.add(root);
            oddNodeNum++;
            while (!queue.isEmpty()) {
                TreeNode temp = queue.poll();
                if (flag) {
                    oddNodeNum--;
                    if (oddNodeNum == 0) {
                        list.add(temp.val);
                    }
                } else {
                    evenNodeNum--;
                    if (evenNodeNum == 0) {
                        list.add(temp.val);
                    }
                }
                if (temp.left != null) {
                    if (flag) {
                        evenNodeNum++;
                    } else {
                        oddNodeNum++;
                    }
                    queue.add(temp.left);
                }
                if (temp.right != null) {
                    if (flag) {
                        evenNodeNum++;
                    } else {
                        oddNodeNum++;
                    }
                    queue.add(temp.right);
                }
                //如果当前是偶数层且偶数层的数目为0 则变为奇数层 反之变为偶数层
                if (evenNodeNum == 0 && !flag || oddNodeNum == 0 && flag) {
                    flag = !flag;
                }
            }
            return list;
        }
    

      虽然这个方法提示战胜了100%的java提交记录。但是用了3个变量。逻辑有点麻烦。

    下面这个只用一个变量就可以

    public static List<Integer> rightSideView1(TreeNode root) {
            if (root == null) {
                return new ArrayList<>();
            }
            List<Integer> list = new ArrayList<>();
            Queue<TreeNode> queue = new ArrayDeque<>();
            queue.add(root);
            while (!queue.isEmpty()) {
                //当前层的数目
                int size = queue.size();
                while (size != 0) {
                    TreeNode temp = queue.poll();
                    if (temp.left != null) {
                        queue.add(temp.left);
                    }
                    if (temp.right != null) {
                        queue.add(temp.right);
                    }
                    if (size == 1) {
                        list.add(temp.val);
                    }
                    size--;
                }
            }
            int size = 0;
    
            return list;
        }
    

      

  • 相关阅读:
    20200807日报
    20200806日报
    《大道至简》读书感悟
    20200805日报
    20200804日报
    20200803日报
    20200802日报
    vue中mounted内如何调完异步方法再渲染
    小程序画布识别iPhone11
    np.meshgrid() 生成网格坐标函数
  • 原文地址:https://www.cnblogs.com/shaomys/p/11829145.html
Copyright © 2011-2022 走看看