二叉树练习

Posted 小小菜_v

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树练习相关的知识,希望对你有一定的参考价值。

描述
给你二叉树的根节点 root ,返回它节点值的 前、中、后序遍历。
数据范围:二叉树的节点数量满足 0≤n≤100 ,二叉树节点的值满足1≤val≤100 ,树的各节点的值各不相同

BM23 二叉树的前序遍历

示例1
输入:1,#,2,3
返回值:[1,2,3]

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return int整型一维数组
#
class Solution:
    def preorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        tree_list = []
        self.perorder(tree_list, root)
        return tree_list
    
    def perorder(self, tree_list: List[int], root: TreeNode):
        if root is None:
            return 
        tree_list.append(root.val)
        self.perorder(tree_list, root.left)
        self.perorder(tree_list, root.right)
            

BM24 二叉树的中序遍历

示例1
输入:1,2,#,#,3
返回值:[2,3,1]
  
示例2
输入:
返回值:[]

示例3
输入:1,2
返回值:[2,1]
 
示例4
输入:1,#,2
返回值:[1,2]
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return int整型一维数组
#
import sys
sys.setrecursionlimit(10000)
class Solution:
    def inorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        tree_list = []
        self.inorder(root, tree_list)
        return tree_list
    
    def inorder(self, root: TreeNode, tree_list:List[int]):
        if root is None:
            return
        
        self.inorder(root.left, tree_list)
        tree_list.append(root.val)
        self.inorder(root.right, tree_list)

BM25 二叉树的后序遍历

示例1
输入:1,#,2,3
返回值:[3,2,1]
  
示例2
输入:1
返回值:[1]
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return int整型一维数组
#
class Solution:
    def postorderTraversal(self , root: TreeNode) -> List[int]:
        # write code here
        tree_list = []
        self.postorder(tree_list, root)
        return tree_list
    
    def postorder(self, tree_list:List[int], root: TreeNode):
        if root is None:
            return
        
        self.postorder(tree_list, root.left)
        self.postorder(tree_list, root.right)
        tree_list.append(root.val)

BM26 求二叉树的层序遍历

描述
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)
例如:
给定的二叉树是3,9,20,#,#,15,7,
该二叉树层序遍历的结果是
[
[3],
[9,20],
[15,7]
]
数据范围:二叉树的节点数满足 1≤n≤10^5

示例1
输入:1,2
返回值:[[1],[2]]

示例2
输入:1,2,3,4,#,#,5
返回值:[[1],[2,3],[4,5]]
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return int整型二维数组
#
import sys
sys.setrecursionlimit(100000)
class Solution:
    def levelOrder(self , root: TreeNode) -> List[List[int]]:
        # write code here
        leve_list = []
        i = 0
        self.level(i, leve_list, root)
        return leve_list
    
    def level(self, i, level_list:List[int], root: TreeNode):
        """通过树的层数和列表的索引来进行递归处理"""
        if root is None:
            return
        if len(level_list)-1 >= i:
            level_list[i].append(root.val)
        else:
            level_list.append([root.val])
        i += 1
        self.level(i, level_list, root.left)
        self.level(i, level_list, root.right)

BM27 按之字形顺序打印二叉树

描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
数据范围:0≤n≤1500,树上每个节点的val满足∣val∣<=1500
要求:空间复杂度:O(n),时间复杂度:O(n)
例如:
给定的二叉树是1,2,3,#,#,4,5
该二叉树之字形层序遍历的结果是
[
[1],
[3,2],
[4,5]
]

示例1
输入:1,2,3,#,#,4,5
返回值:[[1],[3,2],[4,5]]
说明:如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。 
    
示例2
输入:8,6,10,5,7,9,11
返回值:[[8],[10,6],[5,7,9,11]]

示例3
输入:1,2,3,4,5
返回值:[[1],[3,2],[4,5]]
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param pRoot TreeNode类 
# @return int整型二维数组
#
import sys
sys.setrecursionlimit(100000)

class Solution:
    def Print(self , pRoot: TreeNode) -> List[List[int]]:
        # write code here
        i = 0
        l = []
        self.p(i, l, pRoot)
        return l
    
    def p(self, i, l:List[int], pRoot:TreeNode):
        
        if pRoot is None:
            return
        
        if i > len(l)-1:
            l.append([pRoot.val])
        elif i <= len(l)-1 and (i+1)%2 == 0:
#         elif (i+1)%2 == 0:
            l[i].insert(0, pRoot.val)
        else:
            l[i].append(pRoot.val)
        i += 1
        self.p(i, l, pRoot.left)
        self.p(i, l, pRoot.right) 

BM28 二叉树的最大深度

描述
求给定二叉树的最大深度,
深度是指树的根节点到任一叶子节点路径上节点的数量。
最大深度是所有叶子节点的深度的最大值。
(注:叶子节点是指没有子节点的节点。)
数据范围:0≤n≤100000,树上每个节点的val满足 ∣val∣≤100
要求: 时间复杂度 O(n)

示例1
输入:1,2
返回值:2

示例2
输入:1,2,3,4,#,#,5
返回值:3
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param root TreeNode类 
# @return int整型
#
class Solution:
    def maxDepth(self , root: TreeNode) -> int:
        # write code here
        l = []
        i = 0
        self.max_d(i, l, root)
        return len(l)
    
    def max_d(self, i, l:List[int], root: TreeNode):
        
        if root is None:
            return 
        if i > len(l)-1:
            l.append([root.val])
        else:
            l[i].append(root.val)
        i += 1
        self.max_d(i, l, root.left)
        self.max_d(i, l, root.right)
        

以上是关于二叉树练习的主要内容,如果未能解决你的问题,请参考以下文章

二叉树练习题

Java二叉树入门详解(包含二叉树0J练习解析)

Java二叉树入门详解(包含二叉树0J练习解析)

二叉树练习题

二叉树练习题2-对称二叉树

二叉树链式结构