剑指offer 刷题 十八 搜索与回溯(55-I 55-II)

剑指 Offer 55 - I. 二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
在这里插入图片描述
自己写的DFS:

def maxDepth(self, root: TreeNode) -> int:
        res, path = [], []
        def dfs(root, path):
            if not root: return
            path.append(root.val)
            if root.left: dfs(root.left, path)
            if root.right: dfs(root.right, path)
            if not root.left and not root.right:
                res.append(list(path))
            path.pop()
        dfs(root, path)
        return 0 if not res else len(max(res, key=len))

其中新学了一个列表元素取max的方法,就是max(li, key=len), 按照len长度取最大的。还有一个天坑,之前老师讲过,老师还说只有自己写一遍,才知道。就是res.append(path)的时候,path一定要加list,也就是copy一个list出来,不然的话,path会在之后的程序中改变,进而影响res。

接下来是大佬DFS的思路和代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

大佬代码:

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root: return 0
        return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1

在这里插入图片描述
这。。。。太nb了。。。

接下来是我的BFS: 有问题版本

def maxDepth(self, root: TreeNode) -> int:
        if not root: return 0
        count = 1
        queue = collections.deque()
        queue.append(root)
        res = []
        while queue:
            node = queue.popleft()
            res.append(node.val)
            if node.left: 
                count += 1
                queue.append(node.left)
            if node.right: 
                count += 1
                queue.append(node.right)
            if node.right and node.left:
                count -= 1
        return count

这个BFS是我一直写的,但是这里的问题就是回溯那里不对。我记得大佬讲过for循环的办法,但是自己怎么也想不起来了。下面还是看下大佬的思路和代码吧。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看来大佬的思路,自己写的BFS,这回可以了:

def maxDepth(self, root: TreeNode) -> int:
        if not root: return 0
        queue, count = [root], 1
        while queue:
            temp = []
            for node in queue:
                if node.left: temp.append(node.left)
                if node.right: temp.append(node.right)
            # 这样的方式会把本层全部孩子统一加到queue中
            queue = temp
            # 这时候再统一给层数加1
            if queue: count += 1
        return count

在这里插入图片描述
下面是大佬的代码:和我写的差不多,我的代码也越来越精简了。

class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if not root: return 0
        queue, res = [root], 0
        while queue:
            tmp = []
            for node in queue:
                if node.left: tmp.append(node.left)
                if node.right: tmp.append(node.right)
            queue = tmp
            res += 1
        return res

剑指 Offer 55 - II. 平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。

在这里插入图片描述
没做出来,下面是尝试写的代码:

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        if not root: return True
        if root.left and root.right: return True
        return self.isBalanced(root.left) == self.isBalanced(root.right)

下面是大佬的思路和代码:
在这里插入图片描述
在这里插入图片描述
流程和55-I一样,这里不再赘述。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
根据大佬思路,尝试写了下:

def isBalanced(self, root: TreeNode) -> bool:
        def recur(root):
            if abs(recur(root.left) - recur(root.right)) <= 1:
                return max(root.left, root.right) + 1
            else: return -1
            if not root: return 0
            if recur(root.left) == -1 or recur(root.right) == -1: return -1
        return recur(root) != -1

下面是大佬的代码:

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        def recur(root):
            if not root: return 0
            left = recur(root.left)
            if left == -1: return -1
            right = recur(root.right)
            if right == -1: return -1
            return max(left, right) + 1 if abs(left - right) <= 1 else -1

        return recur(root) != -1

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
大佬代码:

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        if not root: return True
        return abs(self.depth(root.left) - self.depth(root.right)) <= 1 and \
            self.isBalanced(root.left) and self.isBalanced(root.right)

    def depth(self, root):
        if not root: return 0
        return max(self.depth(root.left), self.depth(root.right)) + 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值