美文网首页
队列应用-二(N)叉树的层序遍历/深度

队列应用-二(N)叉树的层序遍历/深度

作者: 1哥 | 来源:发表于2023-01-07 22:26 被阅读0次
  1. 二叉树层序遍历


    image.png
image.png

要点数据结构:
(1) queue
front, tail
struct treeNode *queue
(2) 层序遍历管理结构
level ==> *returnSize
levelSize ==> *retColumnSize
int **array 层序遍历数组
要点步骤:
(1) 利用queue的基本操作push, pop, 从root 开始逐层push 每一层node 进 queue,每次pop 一层node 作为遍历该层node, 与此同时准备push 其left, right 来准备下一层的遍历 ;
(2) 分层遍历:pop 该层的所有node进queue:
pop 的所有node的取值存到该层数组里;
pop 的node的left 和right node push 进queue;
下一层node 数量:tail - front;

#define MAX_LEVEL (2000)
#define MAX_NODE (2000)
int** levelOrder(struct TreeNode* root, int* returnSize, int** returnColumnSizes){
    if (root== NULL) {
        *returnSize = 0;
        return NULL;
    }

    int **levelarray=malloc(sizeof(int *) * MAX_LEVEL);
    struct TreeNode **queue=malloc(sizeof(struct TreeNode *) * MAX_NODE);

    int *columeSize = malloc(sizeof(int) * MAX_NODE);
    int front = 0, tail = 0;
    int level = 0;
    int levelsize = 0;

    queue[tail++] = root;
    levelsize = tail - front;

    columeSize[level] = levelsize;
    while(levelsize) {
        int i;
        levelarray[level] = malloc(sizeof(int) * levelsize);
        for(i=0;i<levelsize;i++) {
            struct TreeNode *curNode = queue[front];
            levelarray[level][i] = curNode->val;
            if(curNode->left)
                queue[tail++] = curNode->left;
            if(curNode->right)
                queue[tail++] = curNode->right;            
            front++;
        }
        level++;
        levelsize = tail - front;
        columeSize[level] = levelsize;

    }

    *returnColumnSizes = columeSize;
    *returnSize = level;
    return levelarray;
}
  1. 二叉树的深度
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
#define MAX_NODE (10000)

int maxDepth(struct TreeNode* root){
    if (root == NULL)
        return 0;
    struct TreeNode** queue = malloc(sizeof(struct TreeNode*) * MAX_NODE);

    int front = 0, tail = 0;
    int level = 0;
    int levelSize = 0;

    queue[tail++] = root;
    levelSize = tail - front;

    while(levelSize) {
        int i;

        for(i=0;i<levelSize;i++) {
            struct TreeNode* curNode = queue[front++];
            if(curNode->left)
                queue[tail++] = curNode->left;
            if(curNode->right)
                queue[tail++] = curNode->right;
        }

        levelSize = tail - front;
        level++;
    }
    return level;
}
  1. N叉树层序遍历
#define MAX_LEVEL (1000)
#define MAX_NODE (10000)
int** levelOrder(struct Node* root, int* returnSize, int** returnColumnSizes) {
    if (root == NULL) {
        *returnSize = 0;
        return NULL;
    }
    int **array = malloc(sizeof(int *) *MAX_LEVEL);
    int *arraySize = malloc(sizeof(int) * MAX_LEVEL);

    int front = 0, tail = 0;
    int level = 0, levelSize = 0;

    struct Node** queue = malloc(sizeof (struct Node*) * MAX_NODE);

    queue[tail++] = root;
    levelSize = tail - front;

    while (levelSize) {
        int i;
        arraySize[level] = levelSize;
        array[level] = malloc(sizeof(int) * levelSize);
        for(i=0;i<levelSize;i++) {
            struct Node* curNode = queue[front++];
            array[level][i] = curNode->val;
            int j;
            for(j=0;j<curNode->numChildren;j++) {
                queue[tail++] = curNode->children[j];
            }

        }
        levelSize = tail - front;
        level++;
    }

    *returnColumnSizes = arraySize;
    *returnSize = level;
    return array;

}
  1. N叉树的深度


    image.png
/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     int numChildren;
 *     struct Node** children;
 * };
 */
#define MAX_NODE (10000)
int maxDepth(struct Node* root) {

    if (root == NULL)
        return 0;
    struct Node**queue = malloc(sizeof(struct Node*) * MAX_NODE);  

    int front = 0, tail = 0;
    int level = 0, levelSize = 0;

    queue[tail++] = root;
    levelSize = tail - front;

    while(levelSize) {

        int i;
        for(i=0;i<levelSize;i++) {

            struct Node* curNode = queue[front++];
            int j;
            for(j=0;j<curNode->numChildren;j++) {
                if(curNode->children[j])
                    queue[tail++] = curNode->children[j];
            }
        }
        levelSize = tail - front;
        level++;
    }

    return level;
}

相关文章

  • 二叉树

    是否对称树 是否相同 中序遍历 二叉树的最大深度 二叉树的层序遍历输入:root = [3,9,20,null,n...

  • 栈 队列 queue 队列的基本应用:广度优先遍历 树;层序遍历 图;无权图的最短路径 树 二分搜索树:二叉树:

  • 树的遍历

    N叉树的遍历 N叉树的前序遍历 N叉树的后序遍历 N叉树的层序遍历 二叉树 鉴于递归法遍历比较简单,就不重复写了 ...

  • 二叉树相关算法

    二叉树定义 前序遍历(中序遍历、后续遍历只需要调整append的顺序即可) 层序遍历 二叉树的最大深度 对称二叉树...

  • 算法小结

    算法小结 1 二叉树 定义树节点形式 1.1 层序遍历 语义解析:层序遍历指的是二叉树根据层级进行遍历。 利用队列...

  • Python实现深度优先与广度优先

    二叉树的两种遍历是数据结构的经典考察题目, 广度遍历考察队列结构, 深度遍历考察递归 二叉树 深度优先 先序遍历(...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • 429-N叉树的层序遍历

    N叉树的层序遍历 题目 给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。 例如,给定一个3...

  • 数据结构与算法图的遍历与图的应用

    1.广度优先搜索BFS类似于二叉树的层序遍历算法利用队列实现搜索 2.深度优先搜索DFS类似于树的先序遍历。搜索策...

  • 记一次Tree的遍历

    统计利用先序遍历创建的二叉树的深度 利用先序递归遍历算法创建二叉树并计算该二叉树的深度。先序递归遍历建立二叉树的方...

网友评论

      本文标题:队列应用-二(N)叉树的层序遍历/深度

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