同一棵二叉树?(二叉树)

题目描述

二叉树分别以数组存储方式创建、以先序遍历序列创建。输入二叉树的数组存储、先序遍历结果,判断根据它们创建的二叉树是否是同一棵二叉树。

输入

测试次数t

每组测试数据两行:

第一行:二叉树的数组存储(英文字母表示树结点,#表示空树)

第二行:二叉树的先序遍历结果(英文字母表示树结点,#表示空树)

输出

对每组测试数据,如果两种方式创建的是同一棵二叉树,输出YES,否则,输出NO。

样例输入

3 ABCDE ABD##E##C ABC##DE####W##F AB##CDW###E#F## abc##d ab##c#d

样例输出

YES YES NO

提示

#include<iostream>
#include<string>
using namespace std;
class BitreeNode
{
public:
    char data;
    BitreeNode *left;
    BitreeNode *right;
    BitreeNode()
    {
        left=right=NULL;
    }
};

class Bitree
{
public:
    int pos;
    BitreeNode *Root;
    string strtree;
    string strpre;
    string strin;
    Bitree(string str)
    {
        strpre="";
        strin="";
        pos=0;
        strtree=str;
        Root=CreateBitree();
    }
    BitreeNode *CreateBitree()
    {
        char ch=strtree[pos];
        pos++;
        if(ch==‘#‘)
            return NULL;
        else
        {
            BitreeNode *T=new BitreeNode();
            T->data=ch;
            T->left=CreateBitree();
            T->right=CreateBitree();
            return T;
        }
    }
    void preorder(BitreeNode *T)
    {
        if(T!=NULL)
        {
            strpre+=T->data;
            preorder(T->left);
            preorder(T->right);
        }
        return;
    }
    void inorder(BitreeNode *T)
    {
        if(T!=NULL)
        {
            inorder(T->left);
            strin+=T->data;
            inorder(T->right);
        }
        return;
    }
};

class Martree
{
public:
    char *Tree;
    int number;
    string strpre;
    string strin;
    Martree(string str)
    {
        strpre="";
        strin="";
        number=(int)str.size();
        Tree=new char[number];
        for(int i=0;i<number;i++)
            Tree[i]=str[i];
    }
    void preorder(int i)
    {
        if(i<number)
        {
            if(Tree[i]!=‘#‘)
            {
                strpre+=Tree[i];
                preorder(2*i+1);
                preorder(2*i+2);
            }
        }
        return;
    }
    void inorder(int i)
    {
        if(i<number)
        {
            if(Tree[i]!=‘#‘)
            {
                inorder(2*i+1);
                strin+=Tree[i];
                inorder(2*i+2);
            }
        }
        return;
    }
};

int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        string str1,str2;
        cin>>str1>>str2;
        if(str2[str2.size()-1]!=‘#‘)
            str2+="##";
        Martree mTree(str1);
        Bitree bTree(str2);
        mTree.preorder(0);
        mTree.inorder(0);
        bTree.preorder(bTree.Root);
        bTree.inorder(bTree.Root);
        if(mTree.strpre==bTree.strpre&&mTree.strin==bTree.strin)
            cout<<"YES"<<endl;
        else
            cout<<"NO"<<endl;

    }
    return 0;
}

原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12180863.html

时间: 2024-10-16 01:46:49

同一棵二叉树?(二叉树)的相关文章

javascript实现数据结构: 树和二叉树,二叉树的遍历和基本操作

树型结构是一类非常重要的非线性结构.直观地,树型结构是以分支关系定义的层次结构. 树在计算机领域中也有着广泛的应用,例如在编译程序中,用树来表示源程序的语法结构:在数据库系统中,可用树来组织信息:在分析算法的行为时,可用树来描述其执行过程等等. 下面讲解的内容完整代码在这:https://github.com/LukeLin/data-structure-with-js/blob/master/Binary%20tree/BinaryTree.js 首先看看树的一些概念: 1.树(Tree)是n

二叉树 二叉树的性质 存储结构 遍历二叉树 C实现二叉树的创建和遍历 线索二叉树

定义 二叉树(binary tree)是n(n>=0)个结点的有限集合,该集合为空集合称为空二叉树,或者有一个根结点和两棵互不相交的,分别称为树根结点的左孩子树和右孩子树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树总没有度大于2的结点 左子树和右子树是有顺序的,次数不能任意颠倒 即使树中某结点只有一棵子树,也要区分是左子树还是右子树 特殊的二叉树 1. 斜树 所有的结点都只有左子树的二叉树称为左斜树; 所有的结点都只有右子树的二叉树称为右斜树; 这两者统称为斜树 2. 满二叉树 在一

比较两棵可旋转二叉树是否相等

二叉树左右子结点可旋转是指:可以把二叉树的左结点旋转成为右子树,把右子树的结点旋转成为左子树.这个与判断两棵二叉树的逻辑相同,只是要交叉判断. 算法思路:在文章http://www.cnblogs.com/houjun/p/4860680.html的基础上,把判断代码改成如下: 1 if(T1->data == T2->data) //如果根节点相等 2 return (isEqual(T1->lc,T2->lc) && isEqual(T1->rc,T2-&

数据结构-王道2017-第4章 树与二叉树-二叉树的遍历

typedef int ElemType; typedef struct BitNode { ElemType data; //数据域 struct BitNode *lchild, *rchild; //左右孩子指针 }BitNode,*BitTree; void visit(BitNode *b) { printf("%d ", b->data); } //无论采用哪种遍历方法,时间复杂度都是O(n),因为每个结点都访问一次且仅访问一次,递归工作栈的栈深恰好为树的深度,空间复

数和二叉树——二叉树的建立及应用(遍历等)(基础篇)

二叉树:二叉树是每个结点最多有两个子树的有序树. 先来介绍一下二叉树的一些基本性质吧~ 二叉树的性质: 1.非空二叉树上叶子结点数等于双分支节点数加一. 性质1 二叉树第i层上的结点数目最多为2i-1(i≥1).证明:用数学归纳法证明:     归纳基础:i=1时,有2i-1=20=1.因为第1层上只有一个根结点,所以命题成立.    归纳假设:假设对所有的j(1≤j<i)命题成立,即第j层上至多有2j-1个结点,证明j=i时命题亦成立.    归纳步骤:根据归纳假设,第i-1层上至多有2i-2

DS二叉树—二叉树结点的最大距离

题目描述 二叉树两个结点的距离是一个结点经过双亲结点,祖先结点等中间结点到达另一个结点经过的分支数.二叉树结点的最大距离是所有结点间距离的最大值.例如,下图所示二叉树结点最大距离是3,C和D的距离. 二叉树用先序遍历顺序创建,#表示空树.计算二叉树结点最大距离和最大距离的两个结点(假设二叉树中取最大距离的两个结点唯一). 输入 测试次数T 第2行之后的T行,每行为一棵二叉树先序遍历结果(#表示空树) 输出 对每棵二叉树,输出树的结点最大距离和最大距离的结点,输出格式见样例. 样例输入 3 A##

DS二叉树——二叉树之数组存储

二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用0来表示.,如下图所示 从上图可以看出,右边的是一颗普通的二叉树,当它与左边的完全二叉树对比,发现它比完全二叉树少了第5号结点,所以在数组中用0表示,同样它还少了完全二叉树中的第10.11号结点,所以在数组中也用0表示.结点存储的数据均为非负整数 输入 第一行输入一个整数t,表示有t个二叉树 第二行起,每行输入一个数组,先输入数组长度,再输入数组

DS二叉树--二叉树之父子结点

题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符'0'表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构. 编写程序输出该树的所有叶子结点和它们的父亲结点 输入 第一行输入一个整数t,表示有t个二叉树 第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行 输出 第一行按先序遍历,输出第1个示例的叶子节点 第二行输出第1个示例中与叶子相对应的父亲节点 以此类推输出其它示例的结果 样例输入 3 AB0C00D00 AB00C00 ABCD0000

剑指offer-面试题7-重建二叉树-二叉树

/* 题目: 输入二叉树的前序遍历和中序遍历的结果,重建二叉树.假设输入的前序遍历和中序遍历的结果中不包含重复的数字. */ /* 思路: 使用前序遍历找到根节点,再通过中序遍历找到左子树和右子树. 采用递归的方法建立. */ struct BinaryTreeNode{ int value; BinaryTreeNode* left; BinaryTreeNode* right } BinaryTreeNode* Construct(int* preOrder,int* Inorder,int

DS二叉树—二叉树构建与遍历(不含框架)

题目描述 给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘#’表示,例如AB#C##D##),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历.中序遍历和后序遍历结果. 输入 第一行输入一个整数t,表示有t个二叉树 第二行起输入每个二叉树的先序遍历结果,空树用字符‘#’表示,连续输入t行. 输出 输出每个二叉树的先序遍历.中序遍历和后序遍历结果. 样例输入 2 AB#C##D## AB##C## 样例输出 ABCD BCAD CBDA ABC BAC BCA 提示 #inc