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

来源:互联网 发布:血源诅咒妹子捏脸数据 编辑:程序博客网 时间:2024/05/16 18:00

二叉树的遍历以及重建(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

0 0
原创粉丝点击