Java 二叉树遍历右视图-LeetCode199

题目如下:

题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样。

换成通俗的意思:按层遍历二叉树,输出每层的最右端结点。

这就明白时一道二叉树层序遍历的问题,用一个队列来处理,但是问题是怎么来辨别每层的最右端结点,我思考了半天,最后想出的办法是利用一个标记位,例如上面的例子:

q代表队列,f代表标记结点,right代表记录的最右端结点

q: 1 flag    right:{}

q: flag 2 3   遇到标记位所以移动标记位,并将队头弹出的数据存起来如下

q: 2 3 flag   right:{1}

q: 3 flag 5   right:{1}

q: flag 5 4   遇到标记位所以移动标记位,并将队头弹出的数据存起来如下

q: 5 4 flag   right:{1 3}

q: 4 flag    right:{1 3}

q: flag     遇到标记位所以移动标记位,并将队头弹出的数据存起来如下

q: flag     right:{1 3 4}

此时发现队列元素只剩1,退出循环返回结果

代码如下:

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> right = new ArrayList<Integer>();
        if (root == null)
            return right;
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        TreeNode p = root;
        TreeNode flag = new TreeNode(-99999999);
        q.add(p);
        q.add(flag);
        while (q.size() != 1) {
            p = q.poll();
            if (p.left != null)
                q.add(p.left);
            if (p.right != null)
                q.add(p.right);
            if (q.peek().val == -99999999) {
                right.add(p.val);
                q.poll();
                q.add(flag);
            }
        }

        return right;
    }

这里我标记位开始用了-1,后来郁闷的发现测试集中结点元素有-1,就改为了现在这个,通过了。

另外网上翻阅了下别人的解法,有先将一层的代码全部访问完,再去访问下一层的元素,以此来找到每层最右端结点,代码如下:

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<int> rightSideView(TreeNode *root) {
13         vector<int> res;
14         if (!root) return res;
15         queue<TreeNode*> q;
16         q.push(root);
17         while (!q.empty()) {
18             res.push_back(q.back()->val);
19             int size = q.size();
20             for (int i = 0; i < size; ++i) {
21                 TreeNode *node = q.front();
22                 q.pop();
23                 if (node->left) q.push(node->left);
24                 if (node->right) q.push(node->right);
25             }
26         }
27         return res;
28     }
29 };

C++写的,两种思路都可以的

时间: 2024-12-17 03:05:30

Java 二叉树遍历右视图-LeetCode199的相关文章

LeetCode 199. 二叉树的右视图(Binary Tree Right Side View)

199. 二叉树的右视图 199. Binary Tree Right Side View 题目描述 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. Given a binary tree, imagine yourself standing on the right side of it, return the values of the nodes you can see ordered from top to bottom. LeetCode19

领扣(LeetCode)二叉树的右视图 个人题解

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 <--- / 2 3 <--- \ 5 4 <--- 拿到这题,一开始的思路是强行遍历右节点,后来发现如果右节点的深度低于左节点时,左节点也是输于右视图的一部分,答案错误.然后参考了相关做法,发现正确的做法应该是层次遍历,判断出每一层的所有内容,然后取最右边的值加入答案.直到最后一个层次遍历完毕.

Java 二叉树遍历

package edu.cumt.jnotnull; import java.util.Stack; public class BinaryTree { protected Node root; public BinaryTree(Node root) { this.root = root; } public Node getRoot() { return root; } /** 构造树 */ public static Node init() { Node a = new Node('A');

199. 二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 <--- / 2 3 <--- \ 5 4 <--- class Solution { public List<Integer> rightSideView(TreeNode root) { List<Integer> res = new ArrayList<>(

LeetCode 199 二叉树的右视图

题目: 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 <--- / 2 3 <--- \ 5 4 <--- 解题思路: 层次遍历.每次记录每一层的最右边的那个节点,并输出.这里介绍一个非常好用的模板,这个板子可以用来求高度.某一层节点的个数.树的最大宽度等. 代码: 1 /** 2 * Definition for a binary tree

199二叉树的右视图

题目: 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 来源: https://leetcode-cn.com/problems/binary-tree-right-side-view/ 法一: 自己的代码 构建一个队列,每次都从右边取值,用双层循环实现层序遍历. # 执行用时 :32 ms, 在所有 python3 提交中击败了98.01% 的用户 # 内存消耗 :12.8 MB, 在所有 python3 提交中击败了100.00%的用户 # Def

leetcode.199二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值. 示例: 输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \2 3 <--- \ \ 5 4 <--- 来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-right-side-view著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. 运用层次遍历,记录

java实现二叉树遍历

package com.tree.demo; public class BinaryTree { int data; // 根节点数据   BinaryTree left; // 左子树 BinaryTree right; // 右子树 public BinaryTree(int data) // 实例化二叉树类 { this.data = data; left = null; right = null; } public void insert(BinaryTree root, int dat

【LeetCode-面试算法经典-Java实现】【117-Populating Next Right Pointers in Each Node(二叉树链接右指针II)】

[117-Populating Next Right Pointers in Each Node(二叉树链接右指针II)] [LeetCode-面试算法经典-Java实现][所有题目目录索引] 原题 Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solutio