面试题 07. 重建二叉树(Python3) 二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

 

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

给出的初始代码为:

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

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:

 

解题思路

利用递归的思想

给定preoder和inorder:

  • 根节点必为preorder的第一个元素preorder[0];
  • 找到inorder中preorder[0]所在的位置index;
  • 那么,inorder中index之前的index个元素即为左子树的中序遍历;inorder中index之后的(n-index-1)个元素即为右子树的中序遍历;
  • 而preorder的第2个~第(index+1)个元素即为左子树的前序遍历;preorder的最后(n-index-1)个元素即为右子树的前序遍历。
  • 从而分别得到左子树和右子树的preoder和inorder,继而完成递归。

如下图所示:

 

 

 

代码如下

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

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if (not preorder): # 空树
            return None
        else:
            tree = TreeNode(preorder[0])    # 顶点
            index = inorder.index(preorder[0])  # 中序遍历中左右树的分界点
            # index左边的即为左子树的inorder;右边亦然
            left_inorder = inorder[:index]
            right_inorder = inorder[index+1:len(inorder)]
            # 顶点后的index个数构成的list即为左子树的preorder;最后的即为右子树的preorder
            left_preorder = preorder[1:1+index]
            right_preorder = preorder[1+index:len(preorder)]

            # 递归生成树
            tree.left = self.buildTree(left_preorder,left_inorder)
            tree.right = self.buildTree(right_preorder,right_inorder)

            return tree

 

遇到的问题

在初始代码中,仅根据给出的TreeNode类中的__init__()函数,self.right, self.left都是None。那怎么给TreeNode赋值呢?

难道要更改class TreeNode中的代码?

当然是在Solution里写啊!比如root = TreeNode(3), 那么给左子树和右子树赋值只需要root.left = XXX; root.right = XXX.即可

还是对Python基础差对面向对象不熟啊!

 

 

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R.X. NLOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值