Python 二叉树创建和层次遍历

题目

输入一棵二叉树,请按从上到下、从左到右的顺序输出二叉树各结点的值。要求:二叉树用二叉链表存储。 输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格分开。最后输入的括号()表示结束。如果从根到叶结点的路径上有的结点漏输或多输,则输出-1。

输入示例:
在这里插入图片描述

以上输入序列为:
(3,L) (2,LR) (4,) (1,R) ()
输出为:
4 3 1 2

解决方法:

  1. 如图创建链式结构
class TreeNode():
    def __init__(self,val):
        self.val = val
        self.left = None
        self.right = None
  1. 创建二叉树(这个是我写这篇文章的原因,希望给别人一点参考,因为输入格式,我找了很多发现都没有这种格式的创建形式,只能自己写了)
# 将输入格式为(3,L) (2,LR) (4,) (1,R) ()的转为2个列表
n = input().split(" ")
nums = []
paths = []
for data in n:
    # 当遇到()为结束
    if data != '()':
        num,path = data.split(",")
        # 去掉左右2个括号
        nums.append(int(num.lstrip("(")))
        paths.append(path.rstrip(")"))
# 初始化
root = TreeNode(-1)
for i in range(len(nums)):
    # path为空为root
    if paths[i] == '':
        root.val = nums[i]
    else:
        # 创建一个临时指针用来遍历
        node = root
        for j in list(paths[i]):
            if j == 'L':
                # j为L表示要往左侧走,检查左侧是否为None,当为None时,创建一个结点,-1为题目要求,可按你自己的题目要求改
                if node.left == None:
                    node.left = TreeNode(-1)
                    node = node.left
                else:
                    node = node.left
            elif j == 'R':
                if node.right == None:
                    node.right = TreeNode(-1)
                    node = node.right
                else:
                    node = node.right
        # 结束,赋值
        node.val = nums[i]
  1. 层次遍历(没啥新意,就是传入头节点,然后用一个队列辅助)
def levelPrint(root):
    if not root:
        return []
    current = [root]
    outList= []
    while current:
        next = []
        for point in current:
            if point.left:
                next.append(point.left)
            if point.right:
                next.append(point.right)
            if point.val != -1:
                outList.append(point.val)
        current = next
    return outList

完整代码

class TreeNode():
    def __init__(self,val):
        self.val = val
        self.left = None
        self.right = None
def levelPrint(root):
    if not root:
        return []
    current = [root]
    outList= []
    while current:
        next = []
        for point in current:
            if point.left:
                next.append(point.left)
            if point.right:
                next.append(point.right)
            if point.val != -1:
                outList.append(point.val)
        current = next
    return outList

# 将输入格式为(3,L) (2,LR) (4,) (1,R) ()的转为2个列表
n = input().split(" ")
nums = []
paths = []
for data in n:
    # 当遇到()为结束
    if data != '()':
        num,path = data.split(",")
        # 去掉左右2个括号
        nums.append(int(num.lstrip("(")))
        paths.append(path.rstrip(")"))
# 初始化
root = TreeNode(-1)
for i in range(len(nums)):
    # path为空为root
    if paths[i] == '':
        root.val = nums[i]
    else:
        # 创建一个临时指针用来遍历
        node = root
        for j in list(paths[i]):
            if j == 'L':
                # j为L表示要往左侧走,检查左侧是否为None,当为None时,创建一个结点,-1为题目要求,可按你自己的题目要求改
                if node.left == None:
                    node.left = TreeNode(-1)
                    node = node.left
                else:
                    node = node.left
            elif j == 'R':
                if node.right == None:
                    node.right = TreeNode(-1)
                    node = node.right
                else:
                    node = node.right
        # 结束,赋值
        node.val = nums[i]

l = levelPrint(root)
for i in l:
    print(i,end=" ")

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树层次是一种广度优先搜索,可以使用队列来实现。我们首先将根节点入队,然后依次取出队列中的节点,将其左右子节点入队,直到队列为空。 下面是一个求解二叉树层次的示例代码: ```python class TreeNode: def __init__(self, val): self.val = val self.left = None self.right = None def level_order(root): if root is None: return [] res = [] queue = [root] while queue: level = [] for i in range(len(queue)): node = queue.pop(0) level.append(node.val) if node.left: queue.append(node.left) if node.right: queue.append(node.right) res.append(level) return res # 示例 # 1 # / \ # 2 3 # / \ # 4 5 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) print(level_order(root)) # 输出 [[1], [2, 3], [4, 5]] ``` 在上面的示例中,我们定义了一个 `level_order` 函数,接受一个二叉树的根节点作为参数,返回二叉树层次结果。在函数内部,我们首先判断根节点是否为空,如果为空,则返回空列表。如果根节点不为空,我们创建一个空列表 `res` 用于存储层次结果,并创建一个队列 `queue`,将根节点入队。然后,我们循环遍队列中的节点,依次取出节点并存储其值,将其左右子节点入队,直到队列为空。最后,我们将当前层的节点值列表 `level` 存储到 `res` 中,并继续下一层的遍,直到遍完整个二叉树。最后,我们创建了一个二叉树并调用 `level_order` 函数来求解其层次结果,输出结果为 `[[1], [2, 3], [4, 5]]`。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值