码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-07 21:03:27      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:pos   com   for   let   二叉树   代码   https   cos   main   

题目

技术分享图片
输入样例:

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

标签:pos   com   for   let   二叉树   代码   https   cos   main   

原文地址:http://www.cnblogs.com/messier/p/8000642.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!