数据结构与算法题目集|7-4 是否同一棵二叉搜索树 c++满分题解

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{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

这里我在第二的测试案例卡了一会,最后发现这道题所规定的二叉搜索树不能存在相同的值,虽然输入的数可能会有相同的值,在insert中改了一个地方就好了。在就是一开始写的时候一直用的NULL代替空指针,写道一半发现NULL与int比较时会转化为0, 就换成nullptr了,它只会隐式转化为false,总而言之,以后尽量使用nullptr表示空指针

#include
#include
using namespace std;

// 定义节点结构体,表示二叉树的一个节点
struct node {
    int num;        // 节点值
    node* lchild;   // 左子节点指针
    node* rchild;   // 右子节点指针
    
    // 构造函数,用于初始化节点
    node(int n) : num(n), lchild(nullptr), rchild(nullptr) {
    }
};

// 将节点p插入树中
void insert(node* root, node* p) {
    if (root->lchild == nullptr && p->num < root->num) {
        root->lchild = p;
        return;
    }
    if (root->rchild == nullptr && p->num > root->num) {
        root->rchild = p;
        return;
    }
    if (p->num < root->num) {
        insert(root->lchild, p);
    }
    if (p->num > root->num) {
        insert(root->rchild, p);
    }
}

// 创建包含n个节点的二叉搜索树
node* create(int n) {
    vector st(n);  // 用于存储输入的节点值
    node* root;         // 树的根节点指针
    for (int i = 0; i < n; i++) {
        cin >> st[i];    // 读取节点值
    }
    root = new node{st[0]};  // 将第一个数字作为根节点
    for (int i = 1; i < n; i++) {
        node* p = new node{st[i]};  // 创建新节点
        insert(root, p);            // 将节点插入树中
    }
    return root;
}

// 递归比较两棵二叉树是否相同
bool comparison(node* root1, node* root2) {
    if (root1 == nullptr && root2 == nullptr)
        return true;
    if (root1 == nullptr || root2 == nullptr)
        return false;
    if (root1->num != root2->num)
        return false;
    return comparison(root1->lchild, root2->lchild) && comparison(root1->rchild, root2->rchild);
}

int main() {
    int n;
    cin >> n;  // 输入初始树的节点数
    while (n != 0) {
        int l;
        cin >> l;  // 输入要比较的树的数量
        node* t1;  // 储存初始树的指针
        t1 = create(n);  // 创建初始树
        for (int k = 0; k < l; k++) {
            node* t = create(n);  // 创建新的树
            if (comparison(t1, t)) {
                cout << "Yes" << endl;
            } else {
                cout << "No" << endl;
            }
        }
        cin >> n;  // 重新输入初始树的节点数
    }
    return 0;
}

你可能感兴趣的:(pta数据结构与算法题目集,c++,算法,数据结构)