基础数据结构——是否同一棵二叉搜索树

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

#include<iostream>
#include<vector>

using namespace std;

#define Max_Node 11
#define END -1

typedef struct node
{
int left;
int right;
}Node;

void Initialize_Tree(vector<Node>& Tree,int N)//初始化树
{
for (int i=1; i<=N; ++i)
{
Tree[i].left=END;
Tree[i].right=END;
}
}

void Build_Tree(vector<Node>& Tree,int N)//读取输入并建树
{
int value,flag=0,root=0,pre=0;
while (N--)
{
cin>>value;
if (flag==0)//读到的第一个结点为根结点,记录下来
{
root=value;
pre=root;
flag=1;
}else
{
while (1)
{
if (value>pre && Tree[pre].right!=END)//当前输入值比访问的上一个结点pre(pre最初为根结点)大,且pre有右孩子
{
pre=Tree[pre].right;
}
if (value>pre && Tree[pre].right==END)//当前输入值比访问的上一个结点pre(pre最初为根结点)大,且pre无右孩子
{
Tree[pre].right=value;
pre=root;//下一次输入数字也从根结点开始比较
break;
}
if (value<pre && Tree[pre].left!=END)//当前输入值比访问的上一个结点pre(pre最初为根结点)小,且pre有左孩子
{
pre=Tree[pre].left;
}
if (value<pre && Tree[pre].left==END)//当前输入值比访问的上一个结点pre(pre最初为根结点)小,且pre无左孩子
{
Tree[pre].left=value;
pre=root;//下一次输入数字也从根结点开始比较
break;
}
}
}
}
}

bool Compare_Tree(vector<Node> Tree1,vector<Node> Tree2,int N)//比较两棵树的每一个结点的左右孩子结点是否相等
{
int i=1;
for (; i<=N; ++i)
{
if (!(Tree1[i].left==Tree2[i].left && Tree1[i].right==Tree2[i].right))
{
return false;
}
}
return true;
}

int main()
{
int N,L;
int flag=0;
while (1)
{
cin>>N;
if (N==0)
{
break;
}
cin>>L;
vector<vector<Node> > vec(L,vector<Node>(Max_Node));
vector<Node> Tree(Max_Node);
Initialize_Tree(Tree, N);
for (int i=0; i<L; ++i)
{
Initialize_Tree(vec[i], N);
}
Build_Tree(Tree, N);
for (int i=0; i<L; i++)
{
Build_Tree(vec[i], N);
if (Compare_Tree(Tree, vec[i], N))
{
if (flag==0)
{
flag=1;
cout<<"Yes";
}else
{
cout<<'\n'<<"Yes";
}
}else
{
if (flag==0)
{
flag=1;
cout<<"No";
}else
{
cout<<'\n'<<"No";
}
}
}
}

return 0;
}

猜你喜欢

转载自www.cnblogs.com/JAYPARK/p/9971678.html