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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lvhuiyang/article/details/56291383

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

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页