7、重建二叉树(Python)

题目描述:

  • 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
  • 假设输入的前序遍历和中序遍历的结果中都不含有重复的数字。
  • 例如:输入的前序遍历为{1,2,4,7,3,5,6,8}和中序遍历{4,7,2,1,5,3,8,6},则重建二叉树并输出它的头节点。

题目分析:

一些简要的思路:
二叉树中:

  • 前序遍历的根节点第一个数字。输出顺序:节点、子树、子树
  • 中序遍历的根节点中间位置。输出顺序:子树、节点、子树
  • 后序遍历的根节点最后一个数字。输出顺序:节点、子树、子树
详细思路:

在这里插入图片描述

  • 前序遍历的第一个数字 1 就是根节点的值。
  • 中序遍历中,根节点的位置在序列的中间,左子树的结点在根节点的左边,右子树的结点的值在根节点的右边。故数字 1 前面的三个数字都是左子树节点的值,数字 1 后面的数字都是右子树节点的值。
  • 同样在前序遍历中,根节点后面的3个数字就是3个左子树节点的值,再后面的所有数字就是右子树的结点值。
  • 这时,我们在前序和后序遍历中都找到了左右子树的对应的子序列。
  • 再用递归的方法继续下去就好了!!

代码实现:

class TreeNode:       # 先声明一个二叉树
    def __init__(self,x):
        self.val = x
        self.left = None
        self.right = None
class Solution:       
    # pre是前序遍历,tin是中序遍历
    def reConstructBinaryTree(self,pre,tin):
        if not pre and not tin:    # 排空
            return None
        root = TreeNode(pre[0])    # 根节点
        
        if set(pre) != set(tin):
            return None
        i = tin.index(pre[0])    # 根节点在中序遍历中的index
        
        # 一直递归下去
        root.left = self.reConstructBinaryTree(pre[1:i+1],tin[:i])    # 左子树一直递归下去
        root.right = self.reConstructBinaryTree(pre[i+1:],tin[i+1:])  # 右子树一直递归下去
        
        return root
    
def Print_res(root,lists):     # 打印出后序遍历的数组列表
    if root ==  None:
        return lists
    Print_res(root .left,lists)
    Print_res(root .right,lists)
    lists.append(root .val)
    return lists
 
    

验证

#// 普通二叉树
#//              1
#//           /     \
#//          2       3  
#//         /       / \
#//        4       5   6
#//         \         /
#//          7       8
---------------------------------------------------
输入:
solution = Solution()
    lists=[]
    pre = [1,2,4,7,3,5,6,8]
    tin = [4,7,2,1,5,3,8,6]
    root = solution.reConstructBinaryTree(pre, tin)
    print(Print_res(root,lists))
输出:    [7, 4, 2, 5, 8, 6, 3, 1]
#// 所有结点都没有右子结点
#//            1
#//           / 
#//          2   
#//         / 
#//        3 
#//       /
#//      4
#//     /
#//    5
---------------------------------------------------
输入:
lists=[]
pre = [1, 2, 3, 4, 5]
tin = [5, 4, 3, 2, 1]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:    [5, 4, 3, 2, 1]
#// 所有结点都没有左子结点
#//            1
#//             \ 
#//              2   
#//               \ 
#//                3 
#//                 \
#//                  4
#//                   \
#//                    5
---------------------------------------------------
输入:
lists=[]
pre = [1, 2, 3, 4, 5]
tin = [1, 2, 3, 4, 5]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:   [5, 4, 3, 2, 1]
#// 树中只有一个结点
---------------------------------------------------
输入:
lists=[]
pre = [1]
tin = [1]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:  [1]
#// 完全二叉树
#//              1
#//           /     \
#//          2       3  
#//         / \     / \
#//        4   5   6   7
---------------------------------------------------
输入:
lists=[]
pre = [1, 2, 4, 5, 3, 6, 7]
tin = [4, 2, 5, 1, 6, 3, 7]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:    [4, 5, 2, 6, 7, 3, 1]
#// 输入空指针
---------------------------------------------------
输入:
lists=[]
pre = None
tin = None
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:  []
#// 输入的两个序列不匹配
---------------------------------------------------
输入:
lists=[]
pre = [1, 2, 4, 5, 3, 6, 7]
tin = [4, 2, 8, 1, 6, 3, 7]
root = solution.reConstructBinaryTree(pre, tin)
print(Print_res(root,lists))
输出:  []
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值