面试经典150题-9-二叉树的右视图-力扣122

47 阅读1分钟

二叉树的右视图-力扣122

难度:easy

题目描述

image.png

示例

image.png

解法1:层序遍历

/**
 * 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) {
    // 输出每一层的最右端结点的值即可
    // 直接层次遍历,输出每一层的最后一个结点即可

    //边界相关
    if(root == NULL){
        *returnSize = 0;
        return NULL;
    }
 
    int *res = (int*)malloc(sizeof(int)*101);
    // 用数组模拟队列
    struct TreeNode* queue[101]; 
    int i, k, qsize, qsize_next, head, tail; // head和tail为模拟队列的头尾指针
    struct TreeNode* p;

    queue[0] = root; // 根结点入队
    qsize = 1; qsize_next = 0;// qsize为当前层元素的个数,qsize_next为下一层元素的个数
    head = tail = 0;
    k = 0;

    for(i = 0; i < qsize; i++){
        p = queue[head++]; //队头元素出队

        if(p->left){
            queue[++tail] = p->left;
            qsize_next ++;
        } 
        if(p->right){
            queue[++tail] = p->right;
            qsize_next ++;
        }

        if(i == qsize - 1){ //如果是当前层的最后一个元素
            res[k++] = p->val;
            i = -1;
            qsize = qsize_next;
            qsize_next = 0;
        }

    }    

    *returnSize = k;
    return res;
}

bug记录

力扣报错 image.png

报错原因

一开始定义的res数组是这样定义的

int* res[101];

不申请空间(不malloc)的情况下函数内建立的数组是局部变量,无法带回主函数。

解决方案

在函数里malloc需要返回的数组。注意建立数组时在中括号里写数组大小跟malloc的效果在这方面是完全不一样的。

也就是这样定义

int *res = (int*)malloc(sizeof(int)*101);