二叉树的最大/最小深度(C++ leetcode104.11)

104. 二叉树的最大深度

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

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

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

示例:

给定二叉树 [3,9,20,null,null,15,7],

	3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

解法1:递归 - 深度优先搜索(DFS)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if(root==NULL) return 0;
        else{
            int left_height = maxDepth(root->left);
            int right_height = maxDepth(root->right);
            return max(left_height,right_height)+1;
        }
    }
};
复杂度分析

时间复杂度:我们每个结点只访问一次,因此时间复杂度为 O(N),其中 N 是结点的数量。

空间复杂度:在最糟糕的情况下,树是完全不平衡的,例如每个结点只剩下左子结点,递归将会被调用 N 次(树的高度),因此保持调用栈的存储将是 O(N)。但在最好的情况下(树是完全平衡的),树的高度将是 log(N)。因此,在这种情况下的空间复杂度将是 O(log(N)。

解法2:广度优先搜索(BFS)

//直接改写按序遍历二叉树的代码,输出二维数组的元素个数即可
class Solution {
public:
    int maxDepth(TreeNode* root) {
        vector <vector <int>> ret;   //定义输出的二维数组
        if (!root) return 0;  //如果没有节点,输出0

        queue <TreeNode*> q;   //定义结构体队列q
        q.push(root);  //将根节点加入进去
        while (!q.empty()) {  //当队列不为空时,即表示二叉树还存在左右子树
            int currentLevelSize = q.size();  //当前队列q内的元素个数
            ret.push_back(vector <int> ());  //输出ret加入一个新的空vector
            for (int i = 1; i <= currentLevelSize; i++) {
                auto node = q.front(); q.pop();  //node取为q的第一个元素,再去掉这个元素
                ret.back().push_back(node->val);  //给ret的最后一个元素即空vector加入q的第一个元素
                if (node->left) q.push(node->left);  //如果存在左节点,给队列q加入该节点
                if (node->right) q.push(node->right);
            }
        }
        return ret.size();
    }
};

//不需要定义二维数组,用一个int型变量表示即可
class Solution {
public:
    int maxDepth(TreeNode* root) {
        if (!root) return 0;  //如果没有节点,输出0
	    int depth=0;
        queue <TreeNode*> q;   //定义结构体队列q
        q.push(root);  //将根节点加入进去
        while (!q.empty()) {  //当队列不为空时,即表示二叉树还存在左右子树
            int currentLevelSize = q.size();  //当前队列q内的元素个数
            for (int i = 1; i <= currentLevelSize; i++) {
                auto node = q.front(); q.pop();  //node取为q的第一个元素,再去掉这个元素
                if (node->left) q.push(node->left);  //如果存在左节点,给队列q加入该节点
                if (node->right) q.push(node->right);
            }
            depth++;
        }
        return depth;
    }
};

111. 二叉树的最小深度

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

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

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

示例:

给定二叉树 [3,9,20,null,null,15,7],

	3
   / \
  9  20
    /  \
   15   7

返回它的最小深度 2.

解法 - 递归
int minDepth(TreeNode* root) {
        if(root == NULL) return 0;  //空树深度为0
        if(root -> left == NULL && root -> right == NULL) return 1; //左右子树为空,深度为1
        //根据题意,若一颗子树为空,则最小深度为非空子树的最小深度加一
        if(root -> left == NULL && root -> right != NULL) return minDepth(root -> right) + 1;
        if(root -> left != NULL && root -> right == NULL) return minDepth(root -> left) + 1;
        //若两颗子树都非空,则最小深度为左右子树最小深度较小者加一
        return min(minDepth(root -> left), minDepth(root -> right)) + 1;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章