标签:
题目如下:
题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样。
换成通俗的意思:按层遍历二叉树,输出每层的最右端结点。
这就明白时一道二叉树层序遍历的问题,用一个队列来处理,但是问题是怎么来辨别每层的最右端结点,我思考了半天,最后想出的办法是利用一个标记位,例如上面的例子:
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++写的,两种思路都可以的
标签:
原文地址:http://www.cnblogs.com/xltcjylove/p/4458712.html