04-树4 是否同一棵二叉搜索树

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了04-树4 是否同一棵二叉搜索树相关的知识,希望对你有一定的参考价值。

题目

技术分享图片
输入样例:

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

输出样例:

Yes
No
No

基本思路

先根据第一行的输入建一棵二叉搜索树,每个结点设一个flag表示该结点是否被访问过。判断之后的输入时,对每个元素进行查找,入找到前碰到未访问过的元素或者找不到,说明不是同一棵二叉搜索树。

代码

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

typedef struct Node* link;
struct Node
{
    int val;
    link left;
    link right;
    int flag;              //访问过为1,否则为0
};

link insert(link T, int val);
int check(link T, int val);
void freeTree(link T);
void resetFlag(link T);
int main()
{
    while (1)
    {
        int N, L,same=1;
        scanf("%d", &N);          //插入元素个数
        if (N == 0)
            break;
        scanf("%d", &L);          //检查序列个数

        //根据第一行建树
        link headpos=NULL;
        int temp;
        scanf("%d", &temp);
        headpos = insert(headpos, temp);
        for (int i = 1; i < N; i++)
        {
            scanf("%d", &temp);
            insert(headpos, temp);
        }

        //判断是否是同一棵二叉树
        for (int j = 0; j < L; j++)
        {
            resetFlag(headpos);
            same = 1;
            for (int i = 0; i < N; i++)
            {
                scanf("%d", &temp);
                if (same != 0)
                    same = check(headpos, temp);
            }
            if (same == 1)
                cout << "Yes" << endl;
            else
                cout << "No" << endl;
        }
        same = 1;
        freeTree(headpos);
    }
    return 0;
}

link insert(link T, int val)
{
    
    if (T == NULL)          //如果该结点为空则创立新结点,结束递归
    {
        T = new Node;
        T->val = val;
        T->flag = 0;
        T->left = NULL;
        T->right = NULL;
        return T;

    }

    if (val > T->val)
    {
        T->right = insert(T->right, val);
    }
    else
    {
        T->left = insert(T->left, val);
    }
    return T;
}

int check(link T, int val)
{
    if (!T)               //到达叶结点下一层
        return 0;
    if(T->flag)
    { 

        if (val > T->val)
            check(T->right, val);
        else if (val < T->val)
            check(T->left, val);
        else
            return 0;
    }
    else
    {
        if (val == T->val)
        {
            T->flag = 1;
            return 1;
        }
        else
            return 0;
    }
}

void freeTree(link T)
{
    if (T->right)
        freeTree(T->right);
    if(T->left)
        freeTree(T->left);
    delete T;
}
void resetFlag(link T)
{
    if (T->right)
        resetFlag(T->right);
    if (T->left)
        resetFlag(T->left);
    T->flag = 0;
}

总结

以上是关于04-树4 是否同一棵二叉搜索树的主要内容,如果未能解决你的问题,请参考以下文章

04-树4 是否同一棵二叉搜索树 (25 分)

04-树4 是否同一棵二叉搜索树

04-树4 是否同一棵二叉搜索树

04-树4 是否同一棵二叉搜索树

04-树4 是否同一棵二叉搜索树 (25 分)

04-树4 是否同一棵二叉搜索树(25 分)