二叉树的层序遍历

https://leetcode.cn/problems/binary-tree-level-order-traversal/submissions/500546242/?envType=study-plan-v2&envId=top-100-liked

        二叉树的层序遍历用到广度优先搜索(BFS),二叉树的前中后序遍历一般用深度优先搜索(DFS)。

        层序遍历:即将每一层的结点值遍历完,再进行下一层遍历。

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
输入:root = [1]
输出:[[1]]

        一般对于BFS,我们都会借用其他数据结构的思想------队列的思想--->先进先出

        我们将每一层结点入队列,然后再将这层结点出队列,在出队列的同时,将该结点的左右孩子(不为空)入队列,那么当该层结点出队完时,下一层结点也入队列了。

        我们用双指针front和rear来记录每一层结点的个数,并用此来记录入队列和出队列时结点在队列中的下标。这里出队列,我们只需要让front++即可

//  returnSize表示树的深度(层数)
//  returnColumnSizes是一个一维数组的指针,该数组中存放每一层结点的个数

int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes) {
    *returnSize = 0;//深度初始化为0

    if(root == NULL)//判空
        return NULL;

    int** ans = (int**)malloc(sizeof(int*)*2001);//开辟存放结点的数组
    *returnColumnSizes = (int*)malloc(sizeof(int)*(2001));//开辟returnColumnSizes
    struct TreeNode* que[2001];//模拟队列,存放的是结点的地址
    int front = 0,rear = 0;//双指针

    que[rear++] = root;//先将根节点入队
    while(front != rear)//结束条件:front == rear,即空树,rear-front代表每层结点个数
    {
        ans[(*returnSize)] = (int*)malloc(sizeof(int)*(rear-front));//开辟ans的每一层
        (*returnColumnSizes)[(*returnSize)] = rear-front;//每层结点个数入数组
        int start = front;//记录front,便于将每层结点的val入ans数组
        front = rear;//front变为rear,即下一层的开始,也代表该层出队
        for(int i = start;i<front;i++)//start到front,即front到rear,入ans数组
        {
            ans[(*returnSize)][i-start] = que[i]->val;//入ans数组
            if(que[i]->left)//下一层入队
                que[rear++] = que[i]->left;
            if(que[i]->right)//下一层入队
                que[rear++] = que[i]->right;
        }
        (*returnSize)++;//层数++
    }
    return ans;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YangZ123123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值