1. 程式人生 > >04-樹4 是否同一棵二叉搜索樹

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

思路 http clas name same std 分享圖片 res space

題目

技術分享圖片
輸入樣例:

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 是否同一棵二叉搜索樹