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.分析
每一层最右边的那个数据,因此只需要按照层次遍历一遍这个二叉树,获取每一层的最右边的数据即可。
二叉树层次遍历需要的数据结构是queue,现在是怎样判断每一层遍历结束,为了解决这个问题,可以再queue中插入一个标记NULL,读取到NULL,那说明NULL之前的那个数据就是该层最右边的数据。代码如下:
1 class Solution { 2 public: 3 vector<int> rightSideView(TreeNode *root) { 4 queue<TreeNode *> myQue; 5 vector<int> res; 6 res.clear(); 7 8 if (NULL == root) 9 { 10 return res; 11 } 12 13 myQue.push(root); 14 myQue.push(NULL); 15 TreeNode *temp1,*temp2; 16 17 while (true) 18 { 19 temp1 = myQue.front(); 20 myQue.pop(); 21 temp2 = myQue.front(); 22 //myQue.pop(); 23 if(NULL == temp1 && NULL == temp2) 24 break; 25 if(NULL == temp1) 26 { 27 myQue.push(NULL);//为下一层添加标记 28 continue; 29 30 } 31 if (NULL == temp2)//提取下一个指针,判断是否是标记NULL 32 { 33 res.push_back(temp1->val);//保存最右边的值 34 } 35 36 if(NULL != temp1->left) 37 myQue.push(temp1->left); 38 if (NULL != temp1->right) 39 { 40 myQue.push(temp1->right); 41 } 42 } 43 return res; 44 } 45 };
提交Accepted,呵呵,第一次一次性通过啊。
3.题目扩展,如果题目改成从左往右看呢?
思路也是一样的,也是按照层次遍历,只不过每次是从右往左遍历。只需要将上面代码36-41行做一下调换即可,也就是先保存右子节点,再保存左子节点。