DS二叉树判断--同一棵二叉树?

参照“夜阑優琿”博主的解题方法DS二叉树判断--同一棵二叉树_夜阑優琿-CSDN博客

所参考的文章采用的解决方法前提是完整输入二叉树的先序遍历序列,下面提出当二叉树的先序遍历在不完全输入时的做法(注:本篇文章所提出的解决思路仅输入部分的更改为原创,其他内容为参考)。

题目描述:

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

输入:

测试次数t

每组测试数据两行:

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

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

输出:

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

样例输入:

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

输出:

YES
YES
NO

 可以看到,在样例输入中,第一个样例和第三个样例在进行先序遍历的输入时没有完整输入最后的两个“##”

解决方法:

一、利用标志位判断先序遍历序列的输入完成

//在进行输入时,采用标志位flag进行判断
int flag = 1;//全局变量
char ch;
ch = getchar();//需注意头文件#include<stdio.h>
if(ch=='\n')
    flag = 0;
if(flag)
    return;
//返回主函数,不在进行二叉树的创建

 二、输入先序遍历字符串,再用字符串的各个元素创建二叉树

...    
    BiTree()
	{
		cin >> a;
		cin >> ch;
	}
    string a;
	string ch;
	int i = -1;
	void PreOrderTraverse(BiNode*& p)
	{
		if (i == ch.length())
			return;
		i++;
		if (ch[i] != '#')
		{
			p = new BiNode;
			p->data = ch[i];
			PreOrderTraverse(p->lChlid);
			PreOrderTraverse(p->rChild);
		}
		else
		{
			p = new BiNode;
			p->data = '#';
			p->lChlid = NULL;
			p->rChild = NULL;
		}
	}
...

完整代码:

方法一(借助标志位)

#include<iostream>
#include<stdio.h>
#include<queue>
using namespace std;
int flag=1;
class BiNode
{
    char data;
    BiNode *lChild;
    BiNode *rChild;
    friend class BiTree;
};
class BiTree
{
    BiNode *root;
    string a;
    void PreOrderTraverse(BiNode*& p)
    {
        if(flag) {
            char ch;
            ch = getchar();
            if (ch == '\n')
                flag = 0;
            else {
                if (ch != '#') {
                    p = new BiNode;
                    p->data = ch;
                    PreOrderTraverse(p->lChild);
                    PreOrderTraverse(p->rChild);
                } else {
                    p = new BiNode;
                    p->data = '#';
                    p->lChild = NULL;
                    p->rChild = NULL;
                }
            }
        }
    }
public:
    BiTree()
    {
        cin>>a;
    }
    void PreOrder()
    {
        PreOrderTraverse(root);
    }
    void BFSTraverse()
    {
        BiNode* p;
        queue<BiNode*>Q;
        Q.push(root);
        for(int i=0;i<a.length();i++)
        {
            p = Q.front();
            Q.pop();
            if(p)
            {
                if(p->data!=a[i])
                {
                    cout<<"NO"<<endl;
                    return;
                }
                Q.push(p->lChild);
                Q.push(p->rChild);
            }
        }
        cout<<"YES"<<endl;
    }
};
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        BiTree B;
        getchar(); 
        B.PreOrder();
        B.BFSTraverse();
        flag = 1;
    }
    return 0;
}

方法二(先序遍历以字符串形式输入)

#include<iostream>
#include<queue>
using namespace std;
class BiNode
{
    char data;
    BiNode *lChild;
    BiNode *rChild;
    friend class BiTree;
};
class BiTree
{
    BiNode *root;
    string a;
    string ch;
    int i=-1;
    void PreOrderTraverse(BiNode*& p)
    {
        if(i==ch.length())
            return;
        i++;
        if(ch[i]!='#')
        {
            p = new BiNode;
            p->data = ch[i];
            PreOrderTraverse(p->lChild);
            PreOrderTraverse(p->rChild);
        } else{
            p = new BiNode;
            p->data = '#';
            p->lChild = NULL;
            p->rChild = NULL;
        }
    }
public:
    BiTree()
    {
        cin>>a>>ch;
    }
    void PreOrder()
    {
        PreOrderTraverse(root);
    }
    void BFSTraverse()
    {
        BiNode* p;
        queue<BiNode*>Q;
        Q.push(root);
        for(int i=0;i<a.length();i++)
        {
            p = Q.front();
            Q.pop();
            if(p)
            {
                if(p->data!=a[i])
                {
                    cout<<"NO"<<endl;
                    return;
                }
                Q.push(p->lChild);
                Q.push(p->rChild);
            }
        }
        cout<<"YES"<<endl;
    }
};
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        BiTree B;
        B.PreOrder();
        B.BFSTraverse();
    }
    return 0;
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值