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

      

  • 相关阅读:
    Python strip()方法介绍
    python实现猜拳游戏
    Shopping cart program--python
    转置矩阵的行和列
    Oldman python of full stack-Day2
    根据输入生成二维码
    python 中设置字体/背景颜色
    如何用Notepad++运行python程序
    web前端【第十篇】jQuery基本语法
    web前端【第九篇】JS的DOM对象三
  • 原文地址:https://www.cnblogs.com/shaomys/p/11829145.html
Copyright © 2011-2022 走看看