代码随想录day16 层序遍历接着干

104.二叉树的最大深度

题目

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例: 给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 

代码随想录day16 层序遍历接着干_第1张图片

思考

这题就一句话:用层序遍历把遍历了多少层求出来即可,有多少层深度就是多少,在此重点强调一下,深度和高度的区别:

  • 二叉树节点的深度:指从该节点到根结点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)
  • 二叉树节点的高度:指从该节点到叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始。

代码

//  层序遍历,把一共有多少层求出即可

class Solution {

public:

    int maxDepth(TreeNode* root) {

        queue que;

        if(root == nullptr) return 0;

        que.push(root);

        int res = 0;

        while(!que.empty()) {

            int size = que.size();

            while(size--) {

                TreeNode* node = que.front();

                que.pop();

                if(node->left) que.push(node->left);

                if(node->right) que.push(node->right);

            }

            res++;

        }

        return res;

    }

};

559.n叉树的最大深度

题目

给定一个 n 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

例如,给定一个 3叉树 :我们应返回其最大深度 3。

思考

和上题一样,有多少层深度就是多少,注意这里用for循环把n叉树所有结点都遍历到

N叉树的定义:

class Node {

public:

    int val;

    vector children;

    Node() {}

    Node(int _val) {

        val = _val;

    }

    Node(int _val, vector _children) {

        val = _val;

        children = _children;

    }

};

代码

class Solution {

public:

    int maxDepth(Node* root) {

        queue que;

        if(root == NULL) return 0;

        que.push(root);

        int res = 0;

        while(!que.empty()) {

            int size = que.size();

            while(size--) {

                Node* node = que.front();

                que.pop();

                if((node->children).size() > 0) {

                    for (auto n : node->children) que.push(n);//遍历children结点

                }

            }

            res++;

        }

        return res;

    }

};

111.二叉树的最小深度

题目

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

思考

本题思想依旧是层序遍历,只是这里并不是要遍历所有层(只有当是满二叉树时才需要),顺着这个思路想,如果有一个结点它的左右孩子都为空时,那么证明这个结点已经到底了,最小深度就是这个结点的深度,不管它是不是所处在最后一层

代码

//  层序遍历

class Solution {

public:

    int minDepth(TreeNode* root) {

        queue que;

        if(root == nullptr) return 0;

        que.push(root);

        int res  = 0;

        while(!que.empty()) {

            int size = que.size();

            res++;

            while(size--) {

                TreeNode* node = que.front();

                que.pop();

                if(!node->left && !node->right) return res;//只要有一个结点的左右子结点都为空,证明到在它那个位置到底了

                if(node->left) que.push(node->left);

                if(node->right) que.push(node->right);

            }

        }

        return res;

    }

};

222.完全二叉树的节点个数

题目

给出一个完全二叉树,求出该树的节点个数,注意res的初始值为零而不是一

思考

不用思考,直接遍历++就行

代码

//  层序遍历

class Solution {

public:

    int countNodes(TreeNode* root) {

        queue que;

        if(root ==nullptr) return 0;

        que.push(root);

        int res = 0;

        while(!que.empty()) {

            int size = que.size();

            while(size--) {

                TreeNode* node = que.front();

                que.pop();

                res++;

                if(node->left) que.push(node->left);

                if(node->right) que.push(node->right);

            }

        }

        return res;

    }

};

你可能感兴趣的:(算法,数据结构,leetcode,b树)