hot100-二叉树I

94. 二叉树的中序遍历

94. 二叉树的中序遍历 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        def inorder(root):
            if not root:
                return
            inorder(root.left)
            res.append(root.val)
            inorder(root.right)
        res = []
        inorder(root)
        return res

补充:前序遍历 and 后序遍历

python 复制代码
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        def inorder(root):
            if not root:
                return
            inorder(root.left)
            res.append(root.val)
            inorder(root.right)
        res = []
        inorder(root)
        return res

    def preorderTraversal(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        def preorder(root):
            if not root:
                return
            res.append(root.val)
            preorder(root.left)
            preorder(root.right)
        res = []
        preorder(root)
        return res

    def postorderTraversal(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        def postorder(root):
            if not root:
                return
            postorder(root.left)
            postorder(root.right)
            res.append(root.val)
        res = []
        postorder(root)
        return res

遍历迭代版本

python 复制代码
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        st = []
        res = []
        p = root
        while p or st:
            # 先找到最左边的节点
            while p:
                st.append(p)
                p = p.left
            # st的最后一个元素就是最左边的节点
            p = st.pop()
            res.append(p.val)
            # 处理右子树
            p = p.right
        return res
        
    def preorderTraversal(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        if not root:
            return []
        st = [root]
        res = []
        while st:
            p = st.pop()
            res.append(p.val)
            # 先压入右节点,让左节点先弹出
            if p.right:
                st.append(p.right)
            if p.left:
                st.append(p.left)
        return res
        
    def postorderTraversal(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        if not root:
            return []
        st = [root]
        res = []
        while st:
            p = st.pop()
            res.append(p.val)
            # 先压入左节点,让右节点先弹出
            if p.left:
                st.append(p.left)
            if p.right:
                st.append(p.right)
        # 头 右 左
        # 翻转:左 右 头
        return res[::-1]

空间复杂度:O(n)

时间复杂度:O(n)

104. 二叉树的最大深度

104. 二叉树的最大深度 - 力扣(LeetCode)

深搜版本:

python 复制代码
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: int
        """
        # 深搜
        if not root:
            return 0
        left_h = self.maxDepth(root.left)
        right_h = self.maxDepth(root.right)
        return max(left_h,right_h)+1
python 复制代码
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: int
        """
        # 深搜
        return 0 if not root else max(self.maxDepth(root.left),self.maxDepth(root.right))+1

时间复杂度:O(N)

空间复杂度:O(H) 【H 平均是log N的高度,最差是N】

python 复制代码
class Solution(object):
    def maxDepth(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: int
        """
        # 广搜
        if not root:
            return 0
        queue = [(root,1)]
        while queue:
            node,height = queue.pop(0)
            if node.left: queue.append((node.left,height+1))
            if node.right:queue.append((node.right,height+1))
        return height

时间复杂度:O(N)

空间复杂度:O(N)

226. 翻转二叉树

226. 翻转二叉树 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def invertTree(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: Optional[TreeNode]
        """
        if not root:
            return root
        root.left,root.right = self.invertTree(root.right),self.invertTree(root.left)
        return root

时间复杂度:O(N)

空间复杂度:O(H) 【H 平均是log N的高度,最差是N】

101. 对称二叉树

101. 对称二叉树 - 力扣(LeetCode)

递归:

python 复制代码
class Solution(object):
    def check(self,left,right):
        if not left and not right:
            return True
        if not left or not right:
            return False
        if left.val != right.val:
            return False
        return self.check(left.left,right.right) and self.check(left.right,right.left)

    def isSymmetric(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: bool
        """
        if not root:
            return True
        return self.check(root.left,root.right)

时间复杂度:O(N)

空间复杂度:O(N)

迭代:

python 复制代码
class Solution(object):
    def isSymmetric(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: bool
        """
        if not root:
            return True
        queue = [root.left,root.right]
        while queue:
            left = queue.pop(0)
            right = queue.pop(0)
            if not left and not right:
                continue
            if (not left or not right) or left.val != right.val:
                return False
            queue.append(left.left)
            queue.append(right.right)
            queue.append(left.right)
            queue.append(right.left)
        return True

时间复杂度:O(N)

空间复杂度:O(N)

543. 二叉树的直径

543. 二叉树的直径 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def depth(self,root):
        if not root:
            return 0
        left_h = self.depth(root.left)
        right_h = self.depth(root.right)
        self.ans = max(self.ans,left_h+right_h)
        return max(left_h,right_h)+1

    def diameterOfBinaryTree(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: int
        """
        # 任意一颗子树的直径都可以表示为(左子树深度+右子树深度+1)-1 = 左子树深度+右子树深度
        # 我们只要利用ans记录最大值即可【这个直径不一定出现在根节点,想象一颗左子树和右子树极度不平衡的树】
        #     1
        #    2 
        #   3  4
        #  5     6
        self.ans = 0
        self.depth(root)
        return self.ans

时间复杂度:O(N)

空间复杂度:O(H) 【H 平均是log N的高度,最差是N】

相关推荐
董董灿是个攻城狮5 小时前
AI 视觉连载1:像素
算法
智驱力人工智能5 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
猫头虎6 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
孞㐑¥6 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
八零后琐话6 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
月挽清风6 小时前
代码随想录第十五天
数据结构·算法·leetcode
XX風6 小时前
8.1 PFH&&FPFH
图像处理·算法
NEXT067 小时前
前端算法:从 O(n²) 到 O(n),列表转树的极致优化
前端·数据结构·算法