Java 二叉树遍历右视图-LeetCode199
2024-08-24 09:08:46
题目如下:
题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样。
换成通俗的意思:按层遍历二叉树,输出每层的最右端结点。
这就明白时一道二叉树层序遍历的问题,用一个队列来处理,但是问题是怎么来辨别每层的最右端结点,我思考了半天,最后想出的办法是利用一个标记位,例如上面的例子:
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++写的,两种思路都可以的
最新文章
- UIButton的titleLabe setAttributeSting 首次不起作用
- hdu2604(递推,矩阵快速幂)
- [原创] RT7 Lite win7旗舰版精简方案
- C语言 文件操作6--文件打开方式详解
- JDBC批量处理
- 【转载】C++编译出现 error C2664: 不能将参数 2 从“const char [5]”转换为“LPCTSTR”解决办法。
- 【hdu3247-Resource Archiver】位压DP+AC自动机+SPFA
- Android事件分发原理
- PC-全国的 DNS服务商
- 网站性能优化— WebP 全方位介绍
- 微信小程序豆瓣电影项目的改造过程经验分享
- 华为/华三交换机snmp配置
- mount挂载与umount卸载
- MySQL 数据库的创建&;修改
- 深入Java集合学习系列:LinkedHashMap的实现原理
- 2-24-源码编译搭建LAMP环境-作业 ( By 小甘丶 )
- 【cs231n】图像分类-Linear Classification线性分类
- css常用属性总结:文本属性中的text-align
- 分块+lazy 或者 线段树+lazy Codeforces Round #254 (Div. 2) E
- quick cocos2d-x 下载地址
热门文章
- Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy
- Asp.Net Core + Dapper + Repository 模式 + TDD 学习笔记
- 【微信小程序开发】之如何获取免费ssl证书【图文步骤】
- SAP自定义权限对象
- Android—自定义开关按钮实现
- iOS -- CocoaPods
- 嵌入式&;iOS:回调函数(C)与block(OC)传 参/函数 对比
- ubuntu14.04redis安装以及扩展
- UGUI Text(Label)
- webform:图片水印、验证码制作