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;
        }
    

      

  • 相关阅读:
    OSI参考模型(转)
    H3C交换机配置常用命令(转)
    H3C交换机配置学习随笔
    [Swust OJ 247]--皇帝的新衣(组合数+Lucas定理)
    [Swust OJ 1084]--Mzx0821月赛系列之情书(双线程dp)
    [Swust OJ 404]--最小代价树(动态规划)
    [Swust OJ 610]--吉祥数
    [Swust OJ 137]--波浪数(hash+波浪数构造)
    [Swust OJ 566]--开N方数(牛顿切线法解高次方程)
    [Swust OJ 1125]--又见GCD(数论,素数表存贮因子)
  • 原文地址:https://www.cnblogs.com/shaomys/p/11829145.html
Copyright © 2011-2022 走看看