LeetCode刷题day13||104. 二叉树的最大深度&&559. N 叉树的最大深度&&111. 二叉树的最小深度&&222.完全二叉树的节点个数--二叉树

文章目录

  • 104. 二叉树的最大深度
    • 题目描述
    • 思路分析
    • 代码
  • 559. N 叉树的最大深度
    • 题目描述
    • 思路分析
    • 代码
  • 111. 二叉树的最小深度
    • 题目描述
    • 思路分析
    • 代码
  • 222.完全二叉树的节点个数
    • 题目描述
    • 思路分析
    • 代码

104. 二叉树的最大深度

题目描述

LeetCode刷题day13||104. 二叉树的最大深度&&559. N 叉树的最大深度&&111. 二叉树的最小深度&&222.完全二叉树的节点个数--二叉树_第1张图片
题目链接

思路分析

根节点的高度就是二叉树的最大深度,所以本题中我们通过后序求的根节点高度来求的二叉树最大深度。
递归三部曲
1.确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返回这棵树的深度,所以返回值为int类型。

int getdepth(treenode* node)

2.确定终止条件:如果为空节点的话,就返回0,表示高度为0。

if (node == NULL) return 0;

3.确定单层递归的逻辑:先求它的左子树的深度,再求的右子树的深度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。

int leftdepth = getdepth(node->left);       // 左
int rightdepth = getdepth(node->right);     // 右
int depth = 1 + max(leftdepth, rightdepth); // 中
return depth;

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (root == nullptr) return 0;
        return 1 + max(maxDepth(root->left), maxDepth(root->right));
    }
};

559. N 叉树的最大深度

题目描述

LeetCode刷题day13||104. 二叉树的最大深度&&559. N 叉树的最大深度&&111. 二叉树的最小深度&&222.完全二叉树的节点个数--二叉树_第2张图片
LeetCode刷题day13||104. 二叉树的最大深度&&559. N 叉树的最大深度&&111. 二叉树的最小深度&&222.完全二叉树的节点个数--二叉树_第3张图片
题目链接

思路分析

提供递归法和迭代法,来解决这个问题,思路是和二叉树思路一样的

代码

/*
// Definition for a Node.
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) {
        if (root == NULL) return 0;
        int depth = 0;
        for (int i = 0; i < root->children.size(); ++i) {
            depth = max(depth, maxDepth(root->children[i]));
        }
        return depth + 1;
    }
};
/*
// Definition for a Node.
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<Node*> que;
        if (root != NULL) que.push(root);
        int result = 0;
        while(!que.empty()) {
            int size = que.size();
            result++;
            for (int i = 0; i < size; i++) {
                Node* node = que.front();
                que.pop();
                for (int j = 0; j < node->children.size(); j++) {
                    if (node->children[j]) que.push(node->children[j]);
                }
            }
        }
        return result;
        
    }
};

111. 二叉树的最小深度

题目描述

LeetCode刷题day13||104. 二叉树的最大深度&&559. N 叉树的最大深度&&111. 二叉树的最小深度&&222.完全二叉树的节点个数--二叉树_第4张图片
题目链接

思路分析

LeetCode刷题day13||104. 二叉树的最大深度&&559. N 叉树的最大深度&&111. 二叉树的最小深度&&222.完全二叉树的节点个数--二叉树_第5张图片

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int minDepth(TreeNode* root) {
        if (root == NULL) return 0;
        if (root->left == NULL && root->right != NULL) {
            return 1 + minDepth(root->right);
        }
        if (root->left != NULL && root->right == NULL) {
            return 1 + minDepth(root->left);
        }
        return 1 + min(minDepth(root->left), minDepth(root->right));

    }
};

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

题目描述

LeetCode刷题day13||104. 二叉树的最大深度&&559. N 叉树的最大深度&&111. 二叉树的最小深度&&222.完全二叉树的节点个数--二叉树_第6张图片
题目链接

思路分析

确定单层递归的逻辑:先求它的左子树的节点数量,再求的右子树的节点数量,最后取总和再加一 (加1是因为算上当前中间节点)就是目前节点为根节点的节点数量。
代码如下:

代码

// 版本一
class Solution {
private:
    int getNodesNum(TreeNode* cur) {
        if (cur == NULL) return 0;
        int leftNum = getNodesNum(cur->left);      // 左
        int rightNum = getNodesNum(cur->right);    // 右
        int treeNum = leftNum + rightNum + 1;      // 中
        return treeNum;
    }
public:
    int countNodes(TreeNode* root) {
        return getNodesNum(root);
    }
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root == NULL) return 0;
        return 1 + countNodes(root->left) + countNodes(root->right);

    }
};

利用完全二叉树求法

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root == NULL) return 0;
        TreeNode* leftNode = root->left;
        TreeNode* rightNode = root->right;
        int leftDepth = 0, rightDepth = 0;
        while (leftNode) {
            leftNode = leftNode->left;
            leftDepth++;
        }
        while (rightNode) {
            rightNode = rightNode->right;
            rightDepth++;
        }
        if (rightDepth == leftDepth) {
            return (2 << leftDepth) - 1;
        }
        return countNodes(root->left) + countNodes(root->right) + 1;
 
    }
};

你可能感兴趣的:(leetcode,leetcode,算法,职场和发展)