B. DS二叉树--同一棵二叉树(dsoj c++)

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

输入:

测试次数t

每组测试数据两行:

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

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

输出

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

输入样例1:

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

输出样例1:

YES
YES
NO

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

class bitnode
{
public:
    char data;
    bitnode* left; //左孩子
    bitnode* right; //右孩子
};

class tree
{
public:
    bitnode* root;
    string a;  //数组存储
    string b;  //先序遍历
    int len; //存数组的长度
    tree() //创建树
    {
        cin>>a>>b;
        len=a.length();
    }
    int i=-1;
    void preoder(bitnode* &p)  //把b还原成树
    {
        if(i==b.length())
        {
            return;
        }
        i++;
        if (b[i]!='#')  //不为空树
        {
            p=new bitnode;
            p->data=b[i];
            preoder(p->left);  //递归(先序)
            preoder(p->right);
        }
        else //空树
        {
            p=new bitnode;
            p->data='#';
            //没有孩子
            p->left=NULL;
            p->right=NULL;
        }
    }
    //层次比较
    void compa()
    {
        bitnode*p;
        queue<bitnode*>st;  //结点队列
        st.push(root); //根入队
        for(int j=0;j<len;j++)
        {
            p=st.front();  //取队头
            st.pop(); //弹出
            //如果p不为空
            if(p!=NULL)
            {
                //一一比较,如果不一样则可判断不是同一棵树
                if(p->data!=a[j])
                {
                    cout<<"NO"<<endl;
                    return;
                }
                //左右孩子入队
                st.push(p->left);
                st.push(p->right);
            }
        }
        cout<<"YES"<<endl;
    }
};
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        tree mytree;
        mytree.preoder(mytree.root);
        mytree.compa();
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值