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

二叉树的遍历:

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

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

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

求下面树的三种遍历:

前序遍历: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: [email protected]
@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 = r
def 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 nd
def 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

时间: 2024-12-10 07:56:44

二叉树知道前序中序或者中序后序求另外一个排列的相关文章

已知二叉树的前序遍历结果和中序遍历结果,请重建原来的二叉树

分析的过程: 1.假设前序遍历的第一个值为a,该值就是原二叉树的根节点. 2.在中序遍历结果中查找a. 则在中序遍历中a前面的节点,就是原二叉树a节点左子树的中序遍历结果:在a后面的节点,就是原二叉树a节点右子树的中序遍历结果. 3.由第二步得到a节点左子树的节点个数为m,那么在前序遍历中a后面的m个节点即为a节点左子树的前序遍历结果: 4.由第二步得到a节点右子树的节点个数为n,那么在前序遍历中最后n个节点即为a节点右子树的前序遍历结果: 由此我们可以得到a节点左子树和右子树的前序遍历和中序遍

七:重建二叉树(根据先序遍历(或者后序遍历)和中序遍历重建二叉树)

对于一颗二叉树,可以根据先序遍历(或者后序遍历)和中序遍历(树中不含重复的数字)重新还原出二叉树. 解析: 1. 先序遍历序列的第一个元素必定是根节点,可以由此获取二叉树的根节点. 2. 根据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必定在根节点的左子树中,而根节点右边的序列必定在右子树中.由此可以知道先序遍历中左子树以及右子树的起止位置. 3. 找到了左右子树前序遍历和中序遍历再用同样的方法分别构建左右子树,典型的递归思想. 代码如下: Binary

七:重建二叉树(依据先序遍历(或者后序遍历)和中序遍历重建二叉树)

对于一颗二叉树.能够依据先序遍历(或者后序遍历)和中序遍历(树中不含反复的数字)又一次还原出二叉树. 解析: 1. 先序遍历序列的第一个元素必然是根节点,能够由此获取二叉树的根节点. 2. 依据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必然在根节点的左子树中.而根节点右边的序列必然在右子树中.由此能够知道先序遍历中左子树以及右子树的起止位置. 3. 找到了左右子树前序遍历和中序遍历再用相同的方法分别构建左右子树,典型的递归思想. 代码例如以下: Bin

用一棵二叉树的前序遍历结果和中序遍历结果还原这棵二叉树——6

输入某二叉树的前序遍历和中序遍历的结果,重建出这棵二叉树,假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出这棵满足前序遍历和中序遍历的二叉树并输出它的头结点. 对一棵二叉树前序遍历的顺序是"根结点->左结点->右结点",而中序遍历的顺序是"左结点->根节点->右结点",因此,一般的思路都是酱紫的: 前序遍历列表中,第一个数据

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

二叉树系列(二):已知中序遍历序列和后序遍历序列,求先序遍历序列

前面已经介绍过三种遍历方法的规则,为了大家看着方便,这里我们在重新介绍一遍: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知中序和后序遍历序列,求先序遍历序列. 已知该二叉树的中序

已知二叉树的中序序列为DBGEAFC,后序序列为DGEBFCA,给出相应的二叉树

面对这种问题时我们该怎么解决? 今天写数据结构题.发现了一道总是碰见问题的题在这里我写了一种求解方法我自己称它为分层递归求解. 第一步通过观察我们知道后序遍历时最后一个是根节点A 在中序序列中A的左边是左子树右边是右子树 第二步我们来画第一层为根节点的右子树为A-C-F watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ2p1bnlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolv

【PAT甲级】1043 Is It a Binary Search Tree (25 分)(判断是否为BST的先序遍历并输出后序遍历)

题意: 输入一个正整数N(<=1000),接下来输入N个点的序号.如果刚才输入的序列是一颗二叉搜索树或它的镜像(中心翻转180°)的先序遍历,那么输出YES并输出它的后序遍历,否则输出NO. trick: for(auto it:post) cout<<it<<((it!=post[n-1])?" ":""); 这样输出会使第0,1数据点格式错误...原因未知 cout<<post[0]; for(int i=1;i<

【基础备忘】 二叉树前序、中序、后序遍历相互求法

转自:http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html 今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性: 前序遍历:     1.访问根节点     2.前序遍历左子树     3.前序遍历右子树 中序遍历:     1.中序遍历左子树     2