浙大数据结构之04-树4 是否同一棵二叉搜索树

这篇具有很好参考价值的文章主要介绍了浙大数据结构之04-树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

主要思路:

(1)循环读入数据,并且在读到0时跳出循环可以写在while里

(2)插入二叉搜索树,用递归,因为插入的必是叶子节点,关键要有返回值,返回的是节点指针

(3)先建立初始树,然后建立待比较树,用前序遍历比较两棵树是否相同文章来源地址https://www.toymoban.com/news/detail-572278.html

代码实现:

/*
首先要读入数据
建立原始树
建立插入树
比较原始树和插入树
*/
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX_SIZE 15
/*用链表定义二叉搜索树的数据结构*/
typedef struct Tree Tree;
struct Tree {
    int Data;
    Tree* LeftChild;
    Tree* RightChild;
};
/*插入二叉搜索树*/
Tree* InsertBST(Tree* root, int data) {
    if(root == NULL) {
        root = (Tree*)malloc(sizeof(Tree));
        root->Data = data;
        root->LeftChild = root->RightChild = NULL;
        return root;
    }

    if(root->Data > data) {
        root->LeftChild = InsertBST(root->LeftChild, data);
    }
    else if(root->Data < data) {
        root->RightChild = InsertBST(root->RightChild, data);
    }
    return root;
}
/*前序遍历,判断两棵树是不是同一棵树*/
bool JudgeBST(Tree* root1, Tree* root2) {
    if(root1 == NULL && root2 == NULL) {
        return true;
    }
    if(root1 == NULL && root2 != NULL || root1 != NULL && root2 == NULL) {
        return false;
    }

    if(root1->Data == root2->Data) {
        bool leftSubtree = JudgeBST(root1->LeftChild, root2->LeftChild);
        bool rightSubtree = JudgeBST(root1->RightChild, root2->RightChild);
        if(leftSubtree && rightSubtree) {
            return true;
        }
        else return false;
    }
    else return false;
}
/*删除树*/
void DeleteTree(Tree* root) {
    if(root == NULL) {
        free(root);
        return;
    }

    DeleteTree(root->LeftChild);
    DeleteTree(root->RightChild);
    free(root);
    return;
}
int main() {
    int N, L;
    while(scanf("%d", &N) && N != 0 && scanf("%d", &L)) {
        Tree* initTree = NULL;
        /*建立原始二叉搜索树*/
        for(int i = 0; i < N; i++) {
            int data;
            scanf("%d", &data);
            initTree = InsertBST(initTree, data);
        }
        /*检查序列*/
        for(int i = 0; i < L; i++) {
            Tree* checkTree = NULL;
            for(int i = 0; i < N; i++) {
                int data;
                scanf("%d", &data);
                checkTree = InsertBST(checkTree, data);
            }
            if(JudgeBST(initTree, checkTree)) {
                printf("Yes\n");
            }
            else {
                printf("No\n");
            }
            DeleteTree(checkTree);
        }
        DeleteTree(initTree);
    }
    return 0;
}

到了这里,关于浙大数据结构之04-树4 是否同一棵二叉搜索树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (浙大陈越版)数据结构 第三章 树(上) 3.3 二叉树的遍历

    目录 3.3.1 遍历(先中后) 二叉树的遍历 先序遍历: 中序遍历 后序遍历 tips: 3.3.2 中序非递归遍历 非递归算法实现的基本思路:使用堆栈 中序遍历的非递归算法具体实现方法为: 3.3.3 层序遍历 难点 解决方法: 队列实现 思路 有如下二叉树作为例子: 遍历过程:(出队即

    2024年02月06日
    浏览(48)
  • 浙大数据结构第四周之04-树6 Complete Binary Search Tree

    A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: The left subtree of a node contains only nodes with keys less than the node\\\'s key. The right subtree of a node contains only nodes with keys greater than or equal to the node\\\'s key. Both the left and right subtrees must also be binary search trees. A Comple

    2024年02月16日
    浏览(50)
  • 【数据结构】二叉树的节点数,叶子数,第K层节点数,高度,查找x节点,判断是否为完全二叉树等方法

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 每一个节点有 1.数据

    2024年02月07日
    浏览(46)
  • 初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)

    本篇博客是初阶数据结构树的收尾,将会讲掉 基本二叉树链式结构的具体内容和实现,包括二叉树的构建,前序遍历,中序遍历,后序遍历和层序遍历,计算二叉树结点个数,第k层结点个数,二叉树叶子结点个数,以及判断一个二叉树是否为完全二叉树 。话不多说,开始我

    2024年03月24日
    浏览(51)
  • 数据结构上机实验——二叉树的实现、二叉树遍历、求二叉树的深度/节点数目/叶节点数目、计算二叉树度为1或2的节点数、判断二叉树是否相似

       建立一棵二叉树,试编程实现二叉树的如下基本操作。    1.创建一棵一棵二叉算法。    2.对这棵二叉树进行遍历:先序或中序或后序,分别输出结点的遍历序列。    3.求二叉树的深度/节点数目/叶节点数目。(选做一个)    4.计算二叉树中度为1 的结点数;

    2024年02月06日
    浏览(62)
  • 浙大数据结构之09-排序1 排序

    给定N个(长整型范围内的)整数,要求输出从小到大排序后的结果。 本题旨在测试各种不同的排序算法在各种数据情况下的表现。各组测试数据特点如下: 数据1:只有1个元素; 数据2:11个不相同的整数,测试基本正确性; 数据3:103个随机整数; 数据4:104个随机整数;

    2024年02月11日
    浏览(37)
  • 浙大数据结构第六周之初识图

    给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。 输入格式: 输入第1行给出2个整数N(0N≤10)和E,分别是图的顶点数和边数。随后E行,每行给

    2024年02月05日
    浏览(34)
  • 浙大数据结构第二周之02-线性结构3 Reversing Linked List

    Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6. Input Specification: Each input file contains one test case. For each case, the first line

    2024年02月15日
    浏览(55)
  • 浙大数据结构第一周01-复杂度3 二分查找

    本题要求实现二分查找算法。 函数接口定义: 其中 List 结构定义如下: L 是用户传入的一个线性表,其中 ElementType 元素可以通过、==、进行比较,并且题目保证传入的数据是递增有序的。函数 BinarySearch 要查找 X 在 Data 中的位置,即数组下标(注意:元素从下标1开始存储)

    2024年02月12日
    浏览(48)
  • 浙大数据结构第三周之03-树2 List Leaves

    Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. Input Specification: Each input file contains one test case. For each case, the first line gives a positive integer N (≤10) which is the total number of nodes in the tree -- and hence the nodes are numbered from 0 to N−1. Then N lines follow, each corr

    2024年02月16日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包