【python】Leetcode(Tree)

104. 二叉树的最大深度(递归最大深度)

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

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

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

  • 示例:
    给定二叉树 [3,9,20,null,null,15,7],

      3
     / \
    9  20
      /  \
     15   7
    

返回它的最大深度 3 。

递归左右子树,计算就可以,进一层,加1

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def maxDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if root == None:
            return 0
        else:
            l = self.maxDepth(root.left)+1
            r = self.maxDepth(root.right)+1
            return max(l,r)

111. 二叉树的最小深度(递归最大深度)

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

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

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

  • 示例:
    给定二叉树 [3,9,20,null,null,15,7],

      3
     / \
    9  20
      /  \
     15   7
    

返回它的最小深度 2.

还是和求最大深度的思路一样,只是 max 换成 min,但是要注意只有一个 方向的分支的情况!这个时候如果仅仅把 max 换成 min,会输出 1 的,显然不是我们想要的!为了避免这种情况,加了 if 讨论

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def minDepth(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if root == None:
            return 0
        else:
            l = self.minDepth(root.left)+1
            r = self.minDepth(root.right)+1
            if l == 1: # 防止一个方向的二叉树
                return r
            elif r == 1:
                return l
            else:
                return min(l,r)  

559. N叉树的最大深度(递归最大深度)

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

例如,给定一个 3叉树 :
在这里插入图片描述
我们应返回其最大深度,3。

  • 说明:
    树的深度不会超过 1000。
    树的节点总不会超过 5000。

这里的子树就不是 left 和 right 了,是 children,是一个列表,还是 DFS 那套

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val, children):
        self.val = val
        self.children = children
"""
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: Node
        :rtype: int
        """
        if root == None: # 空树
            return 0
        elif root.children == []: # 只有根节点
            return 1
        else: #递归个个子树,然后返回最深的结果
            return max(self.maxDepth(i) for i in root.children) + 1
        

注意,self.maxDepth(i) for i in root.children 如果写成 self.maxDepth(i for i in root.children) 就是 generator 了!

110. 平衡二叉树(递归最大深度)

给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

  • 示例 1:

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

      3
     / \
    9  20
      /  \
     15   7
    

    返回 true 。

  • 示例 2:
    给定二叉树 [1,2,2,3,3,null,null,4,4]

         1
        / \
       2   2
      / \
     3   3
    / \
    4   4
    

    返回 false 。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        # 递归算法从叶节点往根节点推
        # 先找到最后的叶子结点,从叶子结点开始一步步返回是否平衡
        if root == None:
            return True
        elif abs(self.height(root.left) - self.height(root.right)) > 1: # 根节点左右子树不平衡,false
            return False
        else: # 可能存在子树不平衡的情况,递归下去
            return self.isBalanced(root.left) and self.isBalanced(root.right)
        
    # 递归求树的最大深度
    def height(self, root):
        if root == None:
            return 0
        else:
            l = self.height(root.left) + 1
            r = self.height(root.right) + 1
            return max(l,r)    

513. 找树左下角的值(递归 BFS)

给定一个二叉树,在树的最后一行找到最左边的值。

  • 示例 1:
    输入:

      2
     / \
    1   3
    

输出:
1

  • 示例 2:

输入:

    1
   / \
  2   3
 /   / \
4   5   6
   /
  7

输出:
7

思路:树的层次遍历,每进入下一层,清空记录的值,返回最后一层的第一个元素

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def findBottomLeftValue(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        root_list = [root] #第一层的根节点
        while(root_list):
            tmp_root_list = [] #每一层的根节点列表
            value = [] #记录元素的值,每一层都清空
            for node in root_list:
                if node.left:
                    tmp_root_list.append(node.left)
                if node.right:
                    tmp_root_list.append(node.right)
                value.append(node.val)
            root_list = tmp_root_list
        return value[0] # 返回最后一层的第一个元素

144. 二叉树的前序遍历(前序遍历)

给定一个二叉树,返回它的 前序 遍历。

示例:

输入: [1,null,2,3]

   1
    \
     2
    /
   3 

输出: [1,2,3]

递归如下

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        val = []
        if root == None:
            return val
        else:
            val.append(root.val)
            val.extend(self.preorderTraversal(root.left))
            val.extend(self.preorderTraversal(root.right))
        return val

589. N叉树的前序遍历(前序遍历)

给定一个 N 叉树,返回其节点值的前序遍历。

例如,给定一个 3叉树 :

在这里插入图片描述
返回其前序遍历: [1,3,5,6,2,4]。

1)递归

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val, children):
        self.val = val
        self.children = children
"""
class Solution(object):
    def preorder(self, root):
        """
        :type root: Node
        :rtype: List[int]
        """
        value = [] # 存放遍历后的值
        if root == None: # 为空返回 []
            return value
        else:
            value.append(root.val) # 保存根节点的值
            for node in root.children: # 遍历每个子节点,递归调用先序遍历
                value.extend(self.preorder(node))
        return value

2)迭代
bryant

94. 二叉树的中序遍历(中序遍历)

给定一个二叉树,返回它的中序 遍历。

示例:

输入: [1,null,2,3]

   1
    \
     2
    /
   3

输出: [1,3,2]

思路:调换一下前序遍历的顺序即可

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        val = []
        if root == None:
            return val
        else:
            val.extend(self.inorderTraversal(root.left))
            val.append(root.val)
            val.extend(self.inorderTraversal(root.right))
        return val

230. 二叉搜索树中第K小的元素(中序遍历)

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

说明:
你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数。

示例 1:

输入: root = [3,1,4,null,2], k = 1

   3
  / \
 1   4
  \
   2

输出: 1

思路:中序遍历二叉搜索树可以得到有序(从小到大)的结果,然后返回第 k 个值

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def kthSmallest(self, root, k):
        """
        :type root: TreeNode
        :type k: int
        :rtype: int
        """
        def inorderTraversal(root): # 定义中序遍历函数
            val = []
            if root == None:
                return val
            else:
                val.extend(inorderTraversal(root.left))
                val.append(root.val)
                val.extend(inorderTraversal(root.right))
            return val
        return inorderTraversal(root)[k-1]

145. 二叉树的后序遍历(后序遍历)

给定一个二叉树,返回它的 后序 遍历。

示例:

输入: [1,null,2,3]

   1
    \
     2
    /
   3 

输出: [3,2,1]

思路:调整下前序遍历的顺序即可

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        val = []
        if root == None:
            return val
        else:
            val.extend(self.postorderTraversal(root.left))
            val.extend(self.postorderTraversal(root.right))
            val.append(root.val)
        return val

590. N叉树的后序遍历(后序遍历)

给定一个 N 叉树,返回其节点值的后序遍历。

例如,给定一个 3叉树 :
在这里插入图片描述
返回其后序遍历: [5,6,3,2,4,1].

思路:在二叉树后续遍历的基础上,循环遍历 children 即可

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val, children):
        self.val = val
        self.children = children
"""
class Solution(object):
    def postorder(self, root):
        """
        :type root: Node
        :rtype: List[int]
        """
        val = []
        if root == None:
            return val
        else:
            for node in root.children:
                val.extend(self.postorder(node))
            val.append(root.val)
        return val

617. 合并二叉树(递归)

给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。

你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。

示例 1:
在这里插入图片描述
注意: 合并必须从两个树的根节点开始。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def mergeTrees(self, t1, t2):
        """
        :type t1: TreeNode
        :type t2: TreeNode
        :rtype: TreeNode
        """
        if t1 == None: #这两个判断很关键,弥补了二叉树形状不一样的情况
            return t2
        elif t2 == None:
            return t1
        else:
            t1.val = t1.val+t2.val # 根节点的值相加,保存在t1中
            t1.left = self.mergeTrees(t1.left,t2.left)# 递归左子树
            t1.right = self.mergeTrees(t1.right,t2.right)# 递归右子数
        return t1

注意不等长时候的处理!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值