[leetcode] Binary Tree Right Side View

来源:互联网 发布:淘宝电商卖家怎么做 编辑:程序博客网 时间:2024/06/14 16:43

Problem Description:

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].


这道题是关于二叉树的遍历,题目要求是输出树的每层中最右边的节点。看题目中描述的那个例子,似乎从根节点一路向右输出即可,然而,这题可不能这么简单。当例子中的1或者3没有右孩子,但是有左孩子时又该怎么处理呢?那就向左拐再向右拐。我曾试图用DFS先右后左地搜索,发现找不到合适的标志来确定某个元素是不是那一层最右的元素。(后来看discuss发现有人用DFS写的代码简洁有力,佩服,待会再说TA的算法)。

既然这道题目是输出每层的最右元素,按层,所以BFS比较适合。用一个queue依次保存当前遍历的那层的所有节点,用另一个queue依次保存下一层的所有节点。当当前遍历的那个queue空的时候,即表示访问到了该层的最右元素。接下来交换两层的queue继续下去即可。

下面来说说DFS的方法该怎么处理。

从根节点开始,只要它有右孩子就向右走,没有就向左。遍历的时候只要记录层数就可以了,每层最先被访问到的肯定是最右的元素,而每层只用记录这个元素即可。而怎么知道某个元素是不是某曾的第一个呢?直接把res数组传进去,判断res数组中元素的个数就知道了。


if(lv==res.size()) res.push_back(root->val);dfs(root->right,lv+1,res);dfs(root->left,lv+1,res);

以题目中的例子来说说吧:

当访问到根节点1时,res数组元素数目为0,访问到的1也可以看做是第0层。lv == res.size(),把1放进res数组。

然后访问1的右孩子3,res数组元素数目为1,当前层数也是1,元素3进入res数组。

接下来访问3的右孩子...


这个例子太顺风顺水了,我们来假设上面的那个例子中没有4节点吧,那么输出的res数组应该是1, 3, 5。

所以,访问到3的右孩子(NULL)时,发现为空,所以回退到上一层,访问3的左孩子,也是空。(注意,这里试图访问3的右左孩子时在考虑第2(计数从0开始)层,都没有成功,所以res数组中元素依然只有两个)

接下来再回退一层,访问1的左孩子2。这是第1层,但res数组中元素为2,大于1表示弟1层已经有元素被访问到了,即这里的元素2并不是第1层最右的元素。

接下来是元素2的右孩子5,满足条件lv == res.size(),把5放进res数组。



0 0
原创粉丝点击