首页 > 其他分享 >二叉树 LC104.MaxDepth of Binary Tree

二叉树 LC104.MaxDepth of Binary Tree

时间:2023-01-08 06:55:11浏览次数:43  
标签:Binary right TreeNode res depth 二叉树 left root MaxDepth

最近看了labuladong讲二叉树,掌握了一种思路:

拿到二叉树题目,思考三个维度

——能不能遍历一遍就得出结果? 如果可以,配合一个traverse函数+外部变量进行实现。

——能不能定义一个递归函数,用子问题(子树)推导出原问题的答案?如果可以,写出这个递归函数的定义,并充分利用这个函数的返回值。

——无论使用哪一种思维模式,你都要明白二叉树的每一个节点需要做什么,需要在什么时候(前中后序)做。

Leetcode 104.MaxDepth of Binary Tree 二叉树的最大深度

https://leetcode.com/problems/maximum-depth-of-binary-tree/description/

1.可以遍历一遍就得出结果,用一个traverse函数遍历该二叉树,输入root根结点即可。

设定一个记录max depth的外部遍历res, 以及每一遍走到叶子结点得到一个depth。

res就是从depth里面选择出来的最大值!最后输出res。

因此我们可以用一遍“遍历”来解这道题:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    //res最大深度
    int res = 0;
    //depth当前结点深度
    int depth = 0;
//主函数,求最大深度,输入根结点
    public int maxDepth(TreeNode root) {
        traverse(root);
        return res;
    }
//遍历函数,输入根结点
    void traverse(TreeNode root) {
//corner case:结点是空,直接返回
        if (root == null) {
            return;
        }
//前序位置:进入结点前先深度depth+1
        depth++;
//判断是否是叶子结点,到了叶子结点再和res比较取较大值作为当前最大深度
        if (root.left == null && root.right == null) {
            res = Math.max(res, depth);
        }
//遍历左子树
        traverse(root.left);
//遍历右子树
        traverse(root.right);
//后序位置:要离开结点所以需要深度depth-1
        depth--;
    }
} 

python版本结合stack的思路:

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0

        res = 1
        stack = [[root, 1]]
        while stack:
            node, depth = stack.pop()

            if node:
                res = max(res, depth)
                stack.append([node.left, depth+1])
                stack.append([node.right, depth+1])

        return res

 

2.你也可以把这个问题拆解为:整个二叉树的最大深度=左右子树中的最大深度+1(根结点占据一层),用递归调用maxdepth.

maxDepth递归函数定义 输入root返回maxDepth

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if root == None:
            return 0
        else:
            leftMax = self.maxDepth(root.left)
            rightMax = self.maxDepth(root.right)
            res = max(leftMax,rightMax)+1
        return res

 

3.第一种思路是:遍历一遍得到结果

每个节点需要在遍历进入前先记录它所在的深度(层数),因为不需要获取子树的信息所以其实很自然就是写在前序位置

检查是否是叶子结点:是就要记录此时的临时depth和res进行比较,取较大值

从最底层往上返回的时候要让层数-1

第二种思路:分解问题的思维

每个节点计算左右子树的最大深度+1

既然需要先计算出左右子树的最大深度,所以其实很自然的可以理解需要从底向上的后序遍历!

 

4.补充题解BFS解法

涉及到层数的用BFS都很合适

class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0

        level = 0
        q = deque([root])

        while q:

            for i in range(len(q)):
                node = q.popleft()
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)

            level += 1

        return level

 

5.注意要熟练写的一些内容:

(1).corner case: python中只有None type没有null!

 if root == None:
    return 0

(2).traverse的思路:

def traverse(root):

    res = []

    res.append(root.val)

    traverse(root.left)

    traverse(root.right)

 

 

 

 

 

标签:Binary,right,TreeNode,res,depth,二叉树,left,root,MaxDepth
From: https://www.cnblogs.com/cassiehao/p/17034050.html

相关文章

  • F. Binary Inversions
      思路:计算每个数组中每1相匹配的0的个数-->依次进行01转换比较每个1相匹配0的个数之和,取最大值。intoz[210000][2];intmain(){longtime,i,n,j;inta[......
  • 【C语言 数据结构】二叉树
    文章目录​​二叉树​​​​一、二叉树的概念​​​​二、二叉树的基本形态​​​​三、二叉树的性质​​​​四、特殊的二叉树​​​​五、二叉树的存储结构​​​​5.1......
  • [ABC264Ex] Perfect Binary Tree 题解
    [ABC264Ex]PerfectBinaryTreeSolution目录[ABC264Ex]PerfectBinaryTreeSolution更好的阅读体验戳此进入题面SolutionCodeUPD更好的阅读体验戳此进入题面存在一......
  • 每日算法之在二叉树中找到两个节点的最近公共祖先
    JZ86在二叉树中找到两个节点的最近公共祖先题目给定一棵二叉树(保证非空)以及这棵树上的两个节点对应的val值o1和o2,请找到o1和o2的最近公共祖先节点。注:本题保......
  • LeetCode 103_ 二叉树的锯齿形层序遍历
    LeetCode103:二叉树的锯齿形层序遍历题目给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进......
  • 102. 二叉树的层序遍历
    102.二叉树的层序遍历{学会层序遍历,直接打十个!!}难度中等1542收藏分享切换为英文接收动态反馈给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访......
  • 二叉树的统一迭代法
    二叉树的统一迭代法要想统一写法就要:将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。如何标记呢,就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记......
  • 144. 二叉树的前序遍历
    144.二叉树的前序遍历难度简单965收藏分享切换为英文接收动态反馈给你二叉树的根节点root,返回它节点值的前序遍历。示例1:输入:root=[1,null,2,3]输出:[1,2,3]......
  • 144. 二叉树的前序遍历
    144.二叉树的前序遍历难度简单965收藏分享切换为英文接收动态反馈给你二叉树的根节点root,返回它节点值的前序遍历。示例1:输入:root=[1,null,2,3]输出:[1,2,3]......
  • 145. 二叉树的后序遍历
    145.二叉树的后序遍历难度简单965收藏分享切换为英文接收动态反馈给你一棵二叉树的根节点root,返回其节点值的后序遍历。示例1:输入:root=[1,null,2,3]输出:[3,2......