199.给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
-
看到这个题一开始觉得挺简单,只要将根节点入队,然后出队的时候判断是否有右节点然后入队,重复这个操作将右节点的值放入结果数组即可;但是等到运行的时候发现少了一种情况,那就是如果右结点不存在的话,那左边的结点就能够被看到了,于是又加上了一组判断,在右结点不存在的情况下,判断左节点是否存在,存在则入队,然后基本操作跟前面一样,但等到运行的时候发现又不行了。
-
后来才发现还漏了一种情况,那就是左边的子树的层数如果比右子树层数还多的话,那么按照之前的那种遍历逻辑的话,就永远会漏了这种情况。无奈之下又只能求助题解,题解说用层次遍历,然后将每一层最后一个元素放入结果数组即可。思路很简单,实现起来也不难,基本跟之前实现层次遍历的代码逻辑差不多,不过这次不用对每个元素进行存储,只用对每一层最后一个进行存储,写起来也简单很多了。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* rightSideView(struct TreeNode* root, int* returnSize){
int *res = NULL;
struct TreeNode* queue[2000];
int front = 0, rear = 0, pre_rear; //用pre_rear来界定二叉树每一层
*returnSize = 0;
struct TreeNode* p;
if (!root)
return NULL;
queue[rear] = root;
while (front <= rear) {
pre_rear = rear;
res = realloc(res, (*returnSize + 1) * sizeof(int));
while (front <= pre_rear) {
p = queue[front++];
if (p->left != NULL)
queue[++rear] = p->left;
if (p->right != NULL)
queue[++rear] = p->right;
}
res[(*returnSize)++] = p->val;
}
return res;
}