美文网首页
0102-二叉树的层次遍历

0102-二叉树的层次遍历

作者: liyoucheng2014 | 来源:发表于2018-12-17 08:00 被阅读0次

二叉树的层次遍历

方案一


层序遍历二叉树是典型的广度优先搜索BFS的应用,但是这里稍微复杂一点的是,我们要把各个层的数分开,存到一个二维向量里面,大体思路还是基本相同的,建立一个queue,然后先把根节点放进去,这时候找根节点的左右两个子节点,这时候去掉根节点,此时queue里的元素就是下一层的所有节点,用一个for循环遍历它们,然后存到一个一维向量里,遍历完之后再把这个一维向量存到二维向量里,以此类推,可以完成层序遍历。

C-源代码


#include <stdlib.h>
#include <stdbool.h>
#include <string.h>

struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};

struct link_queue_node102 {
    struct TreeNode *data;
    struct link_queue_node102 *next;
};

struct link_queue102 {
    int count;
    struct link_queue_node102 *head;
    struct link_queue_node102 *tail;
};

struct link_queue102 *link_queue_create102() {
    struct link_queue102 *queue = (struct link_queue102 *)malloc(sizeof(struct link_queue102));
    queue->count = 0;
    queue->head = NULL;
    queue->tail = NULL;
    
    return queue;
}

int link_queue_enqueue102(struct link_queue102 *queue, struct TreeNode *data) {
    struct link_queue_node102 *node = (struct link_queue_node102 *)malloc(sizeof(struct link_queue_node102));
    node->data = data;
    node->next = NULL;
    
    if (queue->head == NULL) {
        queue->head = node;
    }
    else {
        queue->tail->next = node;
    }
    queue->tail = node;
    queue->count += 1;
    
    return 0;
}

bool link_queue_is_empty102(struct link_queue102 * queue) {
    return queue->count == 0;
}

int link_queue_dequeue102(struct link_queue102 *queue, struct TreeNode **data) {
    
    if ((queue == NULL) || link_queue_is_empty102(queue)) {
        return 1;
    }
    
    *data = queue->head->data;
    
    struct link_queue_node102 *node = queue->head;
    queue->head = queue->head->next;
    queue->count -= 1;
    
    if (queue->head == NULL) {
        queue->tail = NULL;
    }
    
    free(node);
    
    return 0;
}

int** levelOrder(struct TreeNode* root, int** columnSizes, int* returnSize) {
    if (root == NULL) {
        *returnSize = 0;
        return NULL;
    }
    
    int **results = (int **)malloc(sizeof(int *) * 1000);
    *columnSizes = (int *)malloc(sizeof(int) * 1000);
    *returnSize = 0;
    
    memset(*columnSizes, 0, sizeof(int) * 1000);
    
    struct link_queue102 *queue = link_queue_create102();
    link_queue_enqueue102(queue, root);
    
    int *nums = (int *)malloc(sizeof(int) * 1000);
    while (!link_queue_is_empty102(queue)) {
        int len = queue->count;
        int *temp = (int *)malloc(sizeof(int) * len);
        for (int i = 0; i < len; i++) {
            
            struct TreeNode *treeNode = NULL;
            link_queue_dequeue102(queue, &treeNode);
            
            temp[i] = treeNode->val;
            
            if (treeNode->left) {
                link_queue_enqueue102(queue, treeNode->left);
            }
            
            if (treeNode->right) {
                link_queue_enqueue102(queue, treeNode->right);
            }
        }
        nums[*returnSize] = len;
        results[*returnSize] = temp;
        
        *returnSize += 1;
    }
    
    *columnSizes = nums;
    
    return results;
}

void prePrintNode(struct TreeNode *root) {
    if (root == NULL) {
        return;
    }
    
    printf("%d ",root->val);
    prePrintNode(root->left);
    prePrintNode(root->right);
}

void test_0102(void) {
    struct TreeNode *node3 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node3->val = 3;
    node3->left = NULL;
    node3->right = NULL;
    
    struct TreeNode *node9 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node9->val = 9;
    node9->left = NULL;
    node9->right = NULL;
    
    struct TreeNode *node20 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node20->val = 20;
    node20->left = NULL;
    node20->right = NULL;
    
    struct TreeNode *node15 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node15->val = 15;
    node15->left = NULL;
    node15->right = NULL;
    
    struct TreeNode *node7 = (struct TreeNode *)malloc(sizeof(struct TreeNode));
    node7->val = 7;
    node7->left = NULL;
    node7->right = NULL;
    
    node3->left = node9;
    node3->right = node20;
    node20->left = node15;
    node20->right = node7;
    
//    prePrintNode(node3);
    
    int *column = NULL;
    int size = 0;
    int **ret = levelOrder(node3, &column, &size);
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < column[i]; j++) {
            printf("%d ", ret[i][j]);
        }
        printf("\n");
    }
}

参考Grandyang

相关文章

  • 二叉树的蛇形层次遍历(LeetCode.103)

    题目 解析 首先参考二叉树的层次遍历层次遍历二叉树(LeetCode--102二叉树的层次遍历)[https://...

  • 0102-二叉树的层次遍历

    二叉树的层次遍历 方案一 层序遍历二叉树是典型的广度优先搜索BFS的应用,但是这里稍微复杂一点的是,我们要把各个层...

  • 二叉树遍历

    二叉树遍历(非递归写法) 先序遍历 中序遍历 后序遍历 层次遍历 给定一个二叉树,返回其按层次遍历的节点值。 (即...

  • 二叉树的基本算法

    一、二叉树的递归遍历 二、二叉树的层次遍历 二叉树的层次遍历是指二叉树从上到下,从左到右遍历数据。同一层中的节点访...

  • 二叉树的层次遍历

    三道层次遍历题,同一个模板,这边用到的是两个队列 二叉树的层次遍历 LeetCode题目地址 二叉树的层次遍历 加...

  • 二叉树的层次遍历

    一、二叉树的层次遍历原理 如图所示为二叉树的层次遍历,即按照箭头所指方向,按照1、2、3、4的层次顺序,对二叉树中...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 数据结构重学日记(二十二)二叉树的层次遍历

    二叉树的层次遍历也属于非递归遍历,和之前先序、中序、后序遍历的区别在于层次遍历需要借助队列来实现。 层次遍历的操作...

  • 二叉树遍历

    1.层次遍历(广度优先遍历) 用队列实现,队首出队,队首的子节点入队。 1,二叉树的层次遍历, 打印 2,二叉树的...

  • 力扣题解(树)

    100. 相同的树 101. 对称二叉树 102. 二叉树的层次遍历 103. 二叉树的锯齿形层次遍历 104. ...

网友评论

      本文标题:0102-二叉树的层次遍历

      本文链接:https://www.haomeiwen.com/subject/swkzhqtx.html