问题描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
前序遍历序列的第一个元素为根结点的值,然后在中序遍历序列中寻找根节点的值的位置。
在二叉树前序遍历和中序遍历的序列中,确定根节点、左子树、右子树的值!
所以该二叉树如下:
详解:
采用了递归的思路进行求解,代码实现如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code here
if not pre or not tin:
return None
#前序根节点和中序索引
root=TreeNode(pre.pop(0))
index=tin.index(root.val)
root.left=self.reConstructBinaryTree(pre,tin[:index])
root.right=self.reConstructBinaryTree(pre,tin[index+1:])
return root
函数语法:
1. pop() 函数语法:
list.pop([index=-1])
pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且 返回该元素的值。
2. List index()方法:
index() 函数用于从列表中找出某个值第一个匹配项的索引位置。
参数:
- x-- 查找的对象。
- start-- 可选,查找的起始位置。
- end-- 可选,查找的结束位置。
list.index(x[, start[, end]])
该方法返回查找对象的索引位置,如果没有找到对象则抛出异常。
代码测试:
# -*- coding:utf-8 -*-
'''
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
'''
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
# write code here
if not pre or not tin:
return None
#前序根节点和中序索引
root=TreeNode(pre.pop(0))
index=tin.index(root.val)
root.left=self.reConstructBinaryTree(pre,tin[:index])
root.right=self.reConstructBinaryTree(pre,tin[index+1:])
return root
if __name__=='__main__':
s=Solution()
re=s.reConstructBinaryTree([1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6])
print(re.val)
print(type(re))
运行结果如下: