二叉树的遍历与重建

参考:https://www.cnblogs.com/freeman818/p/7252041.html

           https://blog.csdn.net/sqiu_11/article/details/77657840

 二叉树的遍历

二叉树的遍历是指访问所有节点且仅访问一次,按照根节点位置的不同分为前序遍历(根节点在前面),中序遍历(根节点在中间),和后序遍历(根节点在后面)。

前序遍历:根节点->左子树->右子树 

中序遍历:左子树->根节点->右子树

后序遍历:左子树->右子树->根节点

例如:对于如下树

前序遍历:12473568

中序遍历:47215386

后序遍历:74258631

二叉树的三种遍历的递归实现

# -*- coding:utf-8 -*-
class Node:
    def __init__(self, val = None, left = None, right = None):
        self.val = val;
        self.left = left
        self.right = right

    def preTraverse(self, root):
        if root==None:
            return
        print(root.val)
        self.preTraverse(root.left)
        self.preTraverse(root.right)


    def midTraverse(self, root):
        if root==None:
            return

        self.midTraverse(root.left)
        print(root.val)
        self.midTraverse(root.right)


    def afterTraverse(self, root):
        if root==None:
            return
        self.afterTraverse(root.left)
        self.afterTraverse(root.right)
        print(root.val)


if __name__=='__main__':
    root = Node('1', Node('2', Node('4', right=Node('7'))), Node('3', Node('5'),Node('6',Node('8'))))
    print('前序遍历')
    root.preTraverse(root)
    print('\n')

    print('中序遍历')
    root.midTraverse(root)
    print('\n')

    print('后序遍历')
    root.afterTraverse(root)
    print('\n')

结果如下:

二叉树的重建

那么,如果我们已知二叉树的前序遍历和中序遍历,我们可以重建二叉树(剑指offer第6题)

思路:利用二叉树前序遍历和中序遍历的特性。前序遍历的第一个值一定为根节点,对应于中序遍历中间的一个点。在中序遍历序列中,这个点左侧的均为根的左子树,这个点右侧的均为根的右子树。这时可以利用递归,分别取前序遍历[1:n+1]和中序遍历的[:n]对应与左子树继续上一个过程,取前序遍历[n+1:]和中序遍历[n+1:]对应于右子树继续上一个过程,最终得以重建二叉树。

# -*- coding:utf-8 -*-

class TreeNode(object):
    ''''节点类'''
    def __init__(self, x=-1):
        self.val = x
        self.left = None
        self.right = None


    def preTraverse(self, root):
        if root==None:
            return
        print(root.val)
        self.preTraverse(root.left)
        self.preTraverse(root.right)


    def midTraverse(self, root):
        if root==None:
            return

        self.midTraverse(root.left)
        print(root.val)
        self.midTraverse(root.right)


    def afterTraverse(self, root):
        if root==None:
            return
        self.afterTraverse(root.left)
        self.afterTraverse(root.right)
        print(root.val)


class Solution:
    # 返回构造的TreeNode根节点
    def reConstructBinaryTree(self, pre, tin):
        # write code here
        if not pre or not tin:
            return None
        root = TreeNode(pre[0])

        n = tin.index(pre[0])


        root.left = self.reConstructBinaryTree(pre[1:n+1], tin[:n])
        root.right = self.reConstructBinaryTree(pre[n+1:], tin[n+1:])

        return root


# test
pre = list('12473568')
tin = list('47215386')
sol = Solution()
newTree = sol.reConstructBinaryTree(pre, tin)
print('前序遍历')
newTree.preTraverse(newTree)
print('中序遍历')
newTree.midTraverse(newTree)
print('后序遍历')
newTree.afterTraverse(newTree)

得到的结果依然和上面的一样,说明我们成功的重建了二叉树。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值