首页 > 代码库 > 二叉树重建及二叉树广度优先遍历

二叉树重建及二叉树广度优先遍历

 

#include <iostream>
#include <queue>
using namespace std;

//树节点类
class TNode
{
public:
    TNode *left, *right;
    char value;
    TNode()
    {
        left = right = NULL;
    }

    TNode(char v)
    {
        left = right = NULL;
        value = http://www.mamicode.com/v;>

 需求分析:


    输入一棵二叉树的先序遍历序列和中序遍历序列,输出它的先序遍历、中序遍历、后序遍历和广度优先遍历序列。 

 

 概要设计

 

 先定义树节点类,使用链表储存方式:

class TNode

{

public:

    TNode *left, *right;

    char value;

    TNode()

    {

        left = right = NULL;

    }

 

    TNode(char v)

    {

        left = right = NULL;

        value = v;

    }

 

};

 

 对于二叉树T,可以递归定义它的先序遍历、中序遍历和后序遍历如下:

 PreOrder(T)=T的根节点+PreOrder(T的左子树)+PreOrder(T的右子树)

 InOrder(T)=InOrder(T的左子树)+T的根节点+InOrder(T的右子树)

 PostOrder(T)=PostOrder(T的左子树)+PostOrder(T的右子树)+T的根节点

 其中加号表示字符串连接运算。例如,对下图所示的二叉树,先序遍历为DBACEGF,中序遍历为ABCDEFG序遍历为ACBFGED 

           D
           / \
          B   E
         /  \  / \
        A  C G F

      

重建二叉树:

因为已经给出二叉树的先序遍历和中序遍历,先序遍历的第一个节点是根节点,然后在中序遍历中找到根,根左边的部分为左子树,右边的部分为右子树 ,然后按照这个过程递归建立左右子树即可。

 

广度优先遍历二叉树:

用队列保存当前访问节点,先把根节点入队,当队列非空时,访问队头节点并把该节点的左右孩子入队后弹出队头元素,直到队列为空



程序输入:

第一行为一个整数t0<t<10),表示测试用例个数。 以下t行,每行输入一个测试用例,包含两个字符序列s1s2,其中s1为一棵二叉树的先序遍历序列,s2为中序遍历序列。s1s2之间用一个空格分隔。序列只包含大写字母,并且每个字母最多只会出现一次程序输出它的先序遍历、中序遍历、后序遍历和广度优先遍历序列。 

 

Sample Input

DBACEGF ABCDEFG BCAD CBAD 

Sample Output

PreOrder: DBACEGF

InOrder: ABCDEFG

PostOrder: ACBFGED

BFS: DBEACGF

 

PreOrder: BCAD

InOrder: CBAD

PostOrder: CDAB

BFS: BCAD


测试结果




附录





二叉树重建及二叉树广度优先遍历