代码随想录刷题|LeetCode 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数(上)

简介: 代码随想录刷题|LeetCode 104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

104.二叉树的最大深度

题目链接:力扣

思路

       1、求高度使用的是后序遍历

后序遍历:(左右中)是一种自上而下的方法,根节点想知道自己的最大告诉的时候,让左右子树去统计,左右子树让分别让自己的左右子树去统计,以此类推。叶子节点下面的空节点返回来说自己是0,叶子节点加上自己的1返回给父节点,父节点再去比较自己左右节点的最大值


      2、求深度使用的是前序遍历


       前序遍历:(中左右)是一种自上而下的方法


       但是这道题目让我们求的是二叉树的最大深度,根节点的高度其实就是二叉树的最大深度,这是这道题目的关键所在,那么我们就可以使用后序遍历求出最大深度


二叉树的最大深度

后序遍历求根的最大高度(递归法)

       第一步:确定参数类型和返回值
       第二步:确定终止条件
       第三步:确定单层的逻辑(按照左右中的顺序进行处理)

class Solution {
    public int maxDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int leftHeight = maxDepth(root.left); // 左子树的最大高度
        int rightHeight = maxDepth(root.right); // 右子树的最大高度
        int maxHeight = 1 + Math.max(leftHeight,rightHeight); // 得到中间节点的最大深度
        return maxHeight;
    }
}

前序遍历求最大深度(递归法)

       采取中左右的前序遍历 涉及回溯思想

class Solution {
  /**
   * 递归法(求深度法)
   */
    //定义最大深度
    int maxnum = 0;
    public int maxDepth(TreeNode root) {
        ans(root,0);
        return maxnum;
    }
    //递归求解最大深度
    void ans(TreeNode tr,int tmp){
        if(tr==null) return;
        tmp++;
        maxnum = maxnum<tmp?tmp:maxnum;
        ans(tr.left,tmp);
        ans(tr.right,tmp);
        tmp--;
    }
}
// 分解写法
class Solution {
    int result;
    public int maxDepth(TreeNode root) {
        result = 0;
        if (root == null) {
            return result;
        }
        getDepth(root,1);
        return result;
    }
    public void getDepth (TreeNode root, int depth) {
        result = depth > result ? depth : result; //中
        if (root.left == null && root.right == null) {
            return;
        }
        if (root.left != null) {                 // 左
            depth++;
            getDepth(root.left,depth);
            depth--;
        }
        if (root.right != null) {                 // 右
            depth++;
            getDepth(root.right,depth);
            depth--;
        }
        return;
    }
}

迭代法求最大深度(迭代法)

       迭代法可以使用层序遍历,循环一层深度加1就可以了,最大深度就是二叉树的层数

       迭代法也是一种自上而下的思路,从上往下一层一层去记录


class Solution {
    public int maxDepth(TreeNode root) {
        int depth = 0;
        if (root == null) {
            return depth;
        }
        // 创建队列
        Deque<TreeNode> deque = new LinkedList<>();
        // 将根节点添加进队列
        deque.offer(root);
        // 开始层序遍历
        while (!deque.isEmpty()) {
            // 获取当前节点的个数
            int len = deque.size();
            // 此时队列不为空,说明这一层是存在的,深度+1
            depth++;
            // 将这一层的节点弹出,同时将下一层的节点添加进来
            for (int i = 0; i < len; i++) {
                TreeNode node = deque.poll();
                if (node.left != null) {
                    deque.offer(node.left);
                }
                if (node.right != null) {
                    deque.offer(node.right);
                }
            }
        }
        return depth;
    }
}

559.n叉树的最大深度

题目链接:力扣

思路

       是求二叉树的最大深度的扩展

n叉树的最大深度

递归法

  原理和二叉树的最大深度的后序遍历法一样


       如果根节点有N个子节点,则这N个子节点对应N个子树。记N个子树的最大深度的最大值为maxChildDepth,则该N叉树的最大深度为maxChildDepth + 1

       每个子树的最大深度又可以通过同样的方式进行计算,因此可以采用【深度优先搜索】的方法计算

       在计算当前N叉树的最大深度时,可以先递归计算出其每个子树的最大深度,然后再计算出当前N叉树的最大深度

       递归访问到空节点结束


class Solution {
    public int maxDepth(Node root) {
        if (root == null) {
            return 0;
        }
        int maxChildDepth = 0;
        if (root.children != null) {
            for (Node child : root.children) {
                maxChildDepth = Math.max(maxChildDepth,maxDepth(child));
            }
        }
        return maxChildDepth + 1;
    }
}

迭代法

       层序遍历

class Solution {
    public int maxDepth(Node root) {
        if (root == null) {
            return 0;
        }
        // 创建队列
        Deque<Node> deque = new ArrayDeque<>();
        // 将根节点添加到队列中
        deque.offer(root);
        // 定义深度
        int depth = 0;
        // 开始层序遍历
        while (!deque.isEmpty()) {
            // 获取当前层数的节点个数
            int len = deque.size();
            // 弹出此层节点,添加对应的孩子节点
            while (len-- > 0) {
                Node node = deque.poll();
                for (Node child : node.children) {
                    deque.offer(child);
                }
            }
            depth++;
        }
        return depth;
    }
}
相关文章
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
504 14
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
380 10
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
618 10
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
861 9
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
316 4
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
115 2
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
136 2
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
143 2
LeetCode第二十四题(两两交换链表中的节点)
这篇文章介绍了LeetCode第24题的解法,即如何通过使用三个指针(preNode, curNode, curNextNode)来两两交换链表中的节点,并提供了详细的代码实现。
218 0
LeetCode第二十四题(两两交换链表中的节点)
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
218 0