力扣199题(二叉树、队列、层次遍历)

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

  1. 看到这个题一开始觉得挺简单,只要将根节点入队,然后出队的时候判断是否有右节点然后入队,重复这个操作将右节点的值放入结果数组即可;但是等到运行的时候发现少了一种情况,那就是如果右结点不存在的话,那左边的结点就能够被看到了,于是又加上了一组判断,在右结点不存在的情况下,判断左节点是否存在,存在则入队,然后基本操作跟前面一样,但等到运行的时候发现又不行了。

  2. 后来才发现还漏了一种情况,那就是左边的子树的层数如果比右子树层数还多的话,那么按照之前的那种遍历逻辑的话,就永远会漏了这种情况。无奈之下又只能求助题解,题解说用层次遍历,然后将每一层最后一个元素放入结果数组即可。思路很简单,实现起来也不难,基本跟之前实现层次遍历的代码逻辑差不多,不过这次不用对每个元素进行存储,只用对每一层最后一个进行存储,写起来也简单很多了。

/**
 * 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值