参照“夜阑優琿”博主的解题方法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;
}