LeetCode 199 二叉树的右视图

题目:

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例:

输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

解题思路:

层次遍历。每次记录每一层的最右边的那个节点,并输出。这里介绍一个非常好用的模板,这个板子可以用来求高度、某一层节点的个数、树的最大宽度等。

代码:

 1 /**
 2  * Definition for a binary tree node.
 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> ans;
14         if(root == NULL)
15             return ans;
16         int front=-1,rear=-1;
17         int last=0,lever=0;
18         //
19         TreeNode* Q[1000];  //1、用一个数组来模拟队列,当然用其他的数据结构也行,但这里若用vector<TreeNode*> 会报错,因为vector中用指针不安全,具体原因未知
20         Q[++rear] = root;
21         TreeNode *p = root;
22         while(front < rear){
23             p = Q[++front];
24             if(p->left != NULL)
25                 Q[++rear] = p->left;
26             if(p->right)
27                 Q[++rear] = p->right;
28             if(last == front){  //2、巧妙之处。在这个语句框中,可以求高度,如level,反向if即可累加计算每一层节点总个数,还可进行比较求树的最大宽度
29                 ans.push_back(Q[front]->val);
30                 last=rear;
31                 lever++;
32             }
33         }
34         return ans;
35     }
36 };

猜你喜欢

转载自www.cnblogs.com/moxiangfeng/p/10668208.html