剑指offer 32-II 从上到下打印二叉树

在这里插入图片描述
第一次做到用两维数组返回,一开始还不知道怎么申请空间。两维数组看成一维数组,里面元素是一维数组,先申请一维数组空间,再申请元素一维数组里元素的空间。
在这里插入图片描述
解题思路:
返回值为一个层序遍历的二维数组,*returnsize行数,** returnColumnSizes列数用一个数组承装。首先动态开辟二维数组空间,列数空间,因为还不知道列数,先不开辟里面元素一维数组空间。
创建一队列,利用层序遍历思想,先将根节点入队,当队列不为空就要将队列里的结点保存到返回的二维数组中。
这里可以求出列数:等于队列尾指针减头指针(rear-front),将列数保存到列数数组中。随即开辟一维数组空间,然后就将结点出队,将数据保存到二维数组中。再将左右子树入队。这里要将之前入队的结点数据都要保存到二维数组中。
详见代码,有注释:

 struct TreeNode {
     int val;
     struct TreeNode *left;
     struct TreeNode *right;
 };
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
    if(root==NULL){
        *returnSize=0;
        *returnColumnSizes=NULL;
        return NULL;
    }
    int **res=(int **)malloc(sizeof(int *)*10001);//二维数组,申请一维数组空间
    *returnColumnSizes=(int *)malloc(sizeof(int)*10001);//用一个数组保存列
    struct TreeNode *queue[10001];
    int front=0;
    int rear=0;
    *returnSize=0;/行
    queue[++rear]=root;//将树节点入队
    //int prefront=front;
    struct TreeNode *T;
    while(front!=rear){
        //T=queue(++front);
        res[*returnSize]=(int *)malloc(sizeof(int)*(rear-front));//申请一位数组元素空间
        (*returnColumnSizes)[*returnSize]=rear-front;//列数等于入队元素个数
        int col=0;
        int prerear=rear;//要将rear保存,后面会左右子树入队会改变rear
        while(front<prerear){//判断条件
            T=queue[++front];
            res[*returnSize][col]=T->val;
            col++;
            //为什么进入循环,要将这一层所有的左右子树都保存。左边的要保存,右边的也要保存
            if(T->left){
                queue[++rear]=T->left;
            }
            if(T->right){
                queue[++rear]=T->right;
            }
        }
        (*returnSize)++;//加括号
    }
    return res;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值