您的位置:首页 > 其它

[leetcode]48 Binary Tree Right Side View

2015-04-07 13:32 197 查看
题目链接:https://leetcode.com/problems/binary-tree-right-side-view/

Runtimes:9ms

1、问题

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.

For example:

Given the following binary tree,

1 <—

/ \

2 3 <—

\ \

5 4 <—

You should return [1, 3, 4].

2、分析

说到底,就是求一棵树的右侧面照,即每一层从右往左第一个数字。肯定是分层遍历,但是这个过程有优化的地方,以前做类似分层遍历题目的时候都是多开几个大vector存储数据,现在又有了新的辨别方式,剩下了很多空间以及时间。

3、小结

只要记录一层最后访问的那个节点即可,即preh < h时,pret就是要求的最后节点。用队列会和遍历的顺序一样,选择正确的数据结构也是很重要的。

4、实现

/**
* 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) {
queue <TreeNode *> tv;
queue <int> iv;
vector<int> rv;
if(NULL == root)
return rv;
tv.push(root);
iv.push(1);
int preh = INT_MAX;
TreeNode *pret;
while(!tv.empty())
{
TreeNode * t = tv.front(); tv.pop();
int h = iv.front(); iv.pop();
if(preh < h)
rv.push_back(pret->val);
if(NULL != t->left)
{
tv.push(t->left);
iv.push(h + 1);
}
if(NULL != t->right)
{
tv.push(t->right);
iv.push(h + 1);
}
preh = h;
pret = t;
}
rv.push_back(pret->val);
return rv;
}
};


5、反思

从编程之美吸收了很多优化方法,一本不错的书。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: