第七周 7-4 是否同一棵二叉搜索树

题目

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

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

输出格式:

对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:

4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0

输出样例:

Yes
No
No

总结出现的问题,每次新建一个节点以后,没有把他们和原来的连接起来,原因是没有用引用,用的值传递。(多犯几次错误总会记住的)。一定要多多测试。

#include<iostream>
using namespace std;
typedef struct BTreeNode* TNode;
struct BTreeNode {
    int data;
    BTreeNode* left;
    BTreeNode* right;
};
class MYBST {
public:
    TNode root = NULL;
    TNode Create(int n);
    void insertNode(TNode &t, int k);
    bool Compare(TNode T, TNode t);
    //void Tranverse(TNode T);
};

//建树
TNode MYBST::Create(int n)
{
    for(int i = 0; i < n; i++)
    {
        int k;
        cin >> k;
        insertNode(root, k);
    }
    return root;
}

//插入节点
void MYBST::insertNode(TNode &t,int k)
{
    if (!t)
    {       
        t = new BTreeNode;
        t->data = k;
        t->left = NULL;
        t->right = NULL;
        
        return;
    }   
    if (k < t->data)
        insertNode(t->left, k);
    else
        insertNode(t->right, k);
}
//比较两棵树
bool MYBST::Compare(TNode T,TNode t)
{
    if (!T && !t)
        return true;
    else if ((T && !t) || (!T&&t))
        return false;
    else if (T->data == t->data)
        return Compare(T->left, t->left) && Compare(T->right, t->right);
    else
        return false;
}
//遍历
//void MYBST::Tranverse(TNode T)
//{
//  if (!T)
//       return;
//  cout << T->data << " 测试 ";
//  Tranverse(T->left);
//  Tranverse(T->right);
//}

int main() 
{
    int n;
    cin >> n;
    while (n)
    {
        MYBST BST;
        int L;
        cin >> L;
        MYBST t[1000];
        BST.root = BST.Create(n);
        //BST.Tranverse(BST.root);
        for (int i = 0; i < L; i++)
        {
            t[i].root = t[i].Create(n);
            //t[i].Tranverse(t[i].root);
            bool flag = BST.Compare(BST.root,t[i].root);
            if (flag)
                cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
        cin >> n;
    }
    system("pause");
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容