二叉树知道前序中序或者中序后序求另外一个排列

来源:互联网 发布:考研网络班 编辑:程序博客网 时间:2024/06/05 07:13


二叉树的遍历:

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

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

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

求下面树的三种遍历:

 

前序遍历:abdefgc

中序遍历:debgfac

后序遍历:edgfbca

详细的二叉树的操作可以看一下我之前写的文章

二叉树java

已知前序、中序遍历,求后序遍历

前序遍历的第一个值就是根节点,然后再中序遍历中找到这个值,那么这个值的左边部分即为当前二叉树的左子树部分前序遍历结果,这个值的右边部分即为当前二叉树的右子树部分前序遍历结果。

如上图:前序a为根节点,再看中序里面的a,由于中序是(根右),所以a的左边debgf为左子树,右边c为右子树

所以递归调用左子树:左子树的前序遍历中序遍历为:bdefg、debgf

再递归调用右子树:c、c

递归的过程:

1 确定根,确定左子树,确定右子树。

2 在左子树中递归。

3 在右子树中递归。

4 打印当前根。

已知中序、后序,求前序遍历

后序遍历最后一个结点即为根结点

递归的过程:

1 确定根,确定左子树,确定右子树。

2 在左子树中递归。

3 在右子树中递归。

4 打印当前根。



如果是在线笔试的话直接使用下面的代码,非常好用


#-*- coding: utf-8 -*-#!/usr/bin/python#Filename: BTreeNode.py'''Created on 2011-4-11@author: boyce@contact: boyce.ywr@gmail.com@version: 1.0'''class BTree:    '''    Represent a no in a binary tree.    '''    def __init__(self, c='/0', l=None, r=None):        '''        Initializes the node's data        '''        self.e = c        self.left = l        self.right = rdef preorderTraverse(bt):    '''    返回前序遍历结果    '''    if bt:        return '%s%s%s' % (bt.e, preorderTraverse(bt.left), preorderTraverse(bt.right))    return ''def inorderTraverse(bt):    '''    返回中序遍历结果    '''    if bt:        return '%s%s%s' % (inorderTraverse(bt.left), bt.e, inorderTraverse(bt.right))    return '';def postorderTraverse(bt):    '''    返回后序遍历结果    '''    if bt:        return '%s%s%s' % (postorderTraverse(bt.left), postorderTraverse(bt.right), bt.e)    return ''def printBTree(bt, depth):    '''    递归打印这棵二叉树,*号表示该节点为NULL    '''    '''    if not bt:        ch = '*'    else:        ch = bt.e    '''    #ch=(lambda x: (x and x.e) or '*')(bt)    ch = bt.e if bt else '*'    if(depth > 0):        print '%s%s%s' % ((depth - 1) * '  ', '--', ch)    else:        print ch    if not bt:        return    printBTree(bt.left, depth + 1)    printBTree(bt.right, depth + 1)def buildBTreeFromPreIn(preo, ino):    '''    根据前序和中序遍历结果重构这棵二叉树    '''    if(preo == '' or ino == ''):        return None    pos = ino.find(preo[0])    if(pos < 0):        return None            return BTree(preo[0], buildBTreeFromPreIn(preo[1:pos + 1], ino[0:pos]), buildBTreeFromPreIn(preo[pos + 1:], ino[pos + 1:]))    #return nddef buildBTreeFromInPost(ino, po):    '''    根据中序和后序遍历结果重构这棵二叉树    '''    if(ino == '' or po == ''):        return None    pos = ino.find(po[-1])    if(pos < 0):        return None       return BTree(po[-1], buildBTreeFromInPost(ino[0:pos], po[0:pos]), buildBTreeFromInPost(ino[pos + 1:], po[pos:-1]))    if __name__ == '__main__':    preo = 'ABDGCEFH'    ino = 'DGBAECHF'    po = 'GDBEHFCA'    bt = buildBTreeFromPreIn(preo, ino)    print 'Build from preorder & inorder'    print 'Preorder: %s' % (preorderTraverse(bt))    print 'Inorder: %s' % (inorderTraverse(bt))    print 'Postorder: %s' % (postorderTraverse(bt))    print 'The BTree is (* means no such a node):'    printBTree(bt, 0)    bt = buildBTreeFromInPost(ino, po)    print 'Build from inorder & postorder'    print 'Preorder: %s' % (preorderTraverse(bt))    print 'Inorder: %s' % (inorderTraverse(bt))    print 'Postorder: %s' % (postorderTraverse(bt))    print 'The BTree is (* means no such a node):'    printBTree(bt, 0)


参考:http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html

http://blog.csdn.net/hinyunsin/article/details/6316185

0 0