Java 二叉树遍历右视图-LeetCode199
2015-04-26 23:24
309 查看
题目如下:
题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样。
换成通俗的意思:按层遍历二叉树,输出每层的最右端结点。
这就明白时一道二叉树层序遍历的问题,用一个队列来处理,但是问题是怎么来辨别每层的最右端结点,我思考了半天,最后想出的办法是利用一个标记位,例如上面的例子:
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,退出循环返回结果
代码如下:
这里我标记位开始用了-1,后来郁闷的发现测试集中结点元素有-1,就改为了现在这个,通过了。
另外网上翻阅了下别人的解法,有先将一层的代码全部访问完,再去访问下一层的元素,以此来找到每层最右端结点,代码如下:
C++写的,两种思路都可以的
题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样。
换成通俗的意思:按层遍历二叉树,输出每层的最右端结点。
这就明白时一道二叉树层序遍历的问题,用一个队列来处理,但是问题是怎么来辨别每层的最右端结点,我思考了半天,最后想出的办法是利用一个标记位,例如上面的例子:
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,就改为了现在这个,通过了。
另外网上翻阅了下别人的解法,有先将一层的代码全部访问完,再去访问下一层的元素,以此来找到每层最右端结点,代码如下:
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: vector<int> rightSideView(TreeNode *root) { vector<int> res; if (!root) return res; queue<TreeNode*> q; q.push(root); while (!q.empty()) { res.push_back(q.back()->val); int size = q.size(); for (int i = 0; i < size; ++i) { TreeNode *node = q.front(); q.pop(); if (node->left) q.push(node->left); if (node->right) q.push(node->right); } } return res; } };
C++写的,两种思路都可以的
相关文章推荐
- Leetcode 199 Binary Tree Right Side View 二叉树右视图
- 【小熊刷题】Binary Tree Right Side View <Leetcode 199, Java>
- Leetcode-199(Java) Binary Tree Right Side View
- Leetcode 199. 二叉树的右视图
- Leetcode 199(Java)
- [leetcode-199]Binary Tree Right Side View(java)
- LeetCode199. 二叉树的右视图
- leetcode 199. Binary Tree Right Side View-树的右视图|递归|非递归|Java|Python
- 【LeetCode-面试算法经典-Java实现】【199-Binary Tree Right Side View(从右边看二叉树)】
- [JAVA]LeetCode199 Binary Tree Right Side View
- Leetcode 199 Binary Tree Right Side View 二叉树右视图
- 【LeetCode-面试算法经典-Java实现】【199-Binary Tree Right Side View(从右边看二叉树)】
- Java for LeetCode 199 Binary Tree Right Side View
- [LeetCode] 022. Generate Parentheses (Medium) (C++/Java/Python)
- java-Leetcode- Binary Tree Traversal
- Leetcode 1.Two Sum(java版)
- Java实现简单二叉树遍历
- leetcode: add two numbers , hash search solution, java. O(n)
- Java for LeetCode 228 Summary Ranges
- leetcode_242_Valid Anagram(easy)(C++)(Java)