您的位置:首页 > 编程语言 > Python开发

二叉树的遍历以及重建(Python实现)

2017-02-21 18:11 435 查看

二叉树的遍历以及重建(Python实现)

二叉树(Binary Tree):一种树形结构,它的特点是每个节点至多只有两颗子树,即不存在度大于2的结点,

并且,二叉树的子树有左右之分,其次序不能任意颠倒。

二叉树结点的表示

class TreeNode:
def __init__(self,value=None,left=None,right=None):
self.value=value
self.left=left
self.right=right


二叉树的遍历

# 前序遍历:以“根左右”顺序递归遍历
def preorder_traverse(node):
if node is None:
return None
print(node.value)
preorder_traverse(node.left)
preorder_traverse(node.right)

# 中序遍历:以“左根右”顺序递归遍历
def inorder_traverse(node):
if node is None:
return None
inorder_traverse(node.left)
print(node.value)
inorder_traverse(node.right)

# 后序遍历:以“左右根”顺序递归遍历
def postorder_traverse(node):
if node is None:
return None
postorder_traverse(node.left)
postorder_traverse(node.right)
print(node.value)


PS:递归还不算熟悉,先挖坑之后填。

下面创建一个二叉树并将其遍历:

if __name__=='__main__':
a1 = TreeNode(1)
a2 = TreeNode(2)
a3 = TreeNode(3)
a4 = TreeNode(4)
a5 = TreeNode(5)
a6 = TreeNode(6)
a7 = TreeNode(7)
a8 = TreeNode(8)
a1.left = a2
a2.left = a4
a4.right = a7
a1.right = a3
a3.left = a5
a3.right = a6
a6.left = a8
preorder_traverse(a1)
inorder_traverse(a1)
postorder_traverse(a1)


经典问题:根据前序和中序遍历结果重建(还原)二叉树

剑指offer原题:

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

分析:

根据前序遍历序列第一个元素1可知二叉树root结点值为1。

使用1把中序遍历序列分成两部分,左侧 [4,7,2]一定是root.left所有值,右侧 [5,3,8,6]一定是root.right所有值。

[4,7,2]的前序遍历的顺序是前序序列第2-4个数值[2,4,7],所以在这棵子树2 是root结点数值。

将2分开[4,7,2]为 [4,7]和[],发现 4,7两个数值都位于左结点,依次确定下一子树。。

同理,root.right的[5,3,8,6]可以根据与[3,5,6,8]顺序关系依次确定整个二叉树。

总结:

先获得root结点的值,根据值的位置把中序遍历序列分为两部分

根据两部分序列长度将除root值外的前序序列同样分为两部分

数组两两组合通过递归找到子孙树左右节点以及值

注意将序列分割的起点以及终点

答案:

class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
if len(pre) == 0:
return None
# write code here
root_val = pre[0]
root_position = tin.index(root_val)
root = TreeNode(root_val)
root.left = self.reConstructBinaryTree(pre[1:root_position + 1], tin[:root_position])
root.right = self.reConstructBinaryTree(pre[root_position + 1:], tin[root_position + 1:])
return root


参考:http://blog.csdn.net/littlethunder/article/details/9707669
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 二叉树