题目如下:

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

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

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

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 = ; 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++写的,两种思路都可以的

最新文章

  1. UIButton的titleLabe setAttributeSting 首次不起作用
  2. hdu2604(递推,矩阵快速幂)
  3. [原创] RT7 Lite win7旗舰版精简方案
  4. C语言 文件操作6--文件打开方式详解
  5. JDBC批量处理
  6. 【转载】C++编译出现 error C2664: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”解决办法。
  7. 【hdu3247-Resource Archiver】位压DP+AC自动机+SPFA
  8. Android事件分发原理
  9. PC-全国的 DNS服务商
  10. 网站性能优化— WebP 全方位介绍
  11. 微信小程序豆瓣电影项目的改造过程经验分享
  12. 华为/华三交换机snmp配置
  13. mount挂载与umount卸载
  14. MySQL 数据库的创建&amp;修改
  15. 深入Java集合学习系列:LinkedHashMap的实现原理
  16. 2-24-源码编译搭建LAMP环境-作业 ( By 小甘丶 )
  17. 【cs231n】图像分类-Linear Classification线性分类
  18. css常用属性总结:文本属性中的text-align
  19. 分块+lazy 或者 线段树+lazy Codeforces Round #254 (Div. 2) E
  20. quick cocos2d-x 下载地址

热门文章

  1. Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy
  2. Asp.Net Core + Dapper + Repository 模式 + TDD 学习笔记
  3. 【微信小程序开发】之如何获取免费ssl证书【图文步骤】
  4. SAP自定义权限对象
  5. Android—自定义开关按钮实现
  6. iOS -- CocoaPods
  7. 嵌入式&amp;iOS:回调函数(C)与block(OC)传 参/函数 对比
  8. ubuntu14.04redis安装以及扩展
  9. UGUI Text(Label)
  10. webform:图片水印、验证码制作