题目:
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [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 };
原文地址:https://www.cnblogs.com/moxiangfeng/p/10668208.html
时间: 2024-10-17 06:47:29