数据结构——二叉搜索树PTA习题

简介: 数据结构——二叉搜索树PTA习题

单选题


image.png


选择题题解


1、二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。


7、 如下图8 是根节点,6 是左子节点



9、例如B选项:则以28为根的子树,它的左子树上既有18又有36、35.所以弃选.

C,D同理 只有A符合



函数题


6-1 是否二叉搜索树 (25分)


本题要求实现函数,判断给定二叉树是否二叉搜索树。


函数接口定义:


bool IsBST ( BinTree T );


其中BinTree结构定义如下:


typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};


函数IsBST须判断给定的T是否二叉搜索树,即满足如下定义的二叉树:


定义:一个二叉搜索树是一棵二叉树,它可以为空。如果不为空,它将满足以下性质:


非空左子树的所有键值小于其根结点的键值。


非空右子树的所有键值大于其根结点的键值。


左、右子树都是二叉搜索树。


如果T是二叉搜索树,则函数返回true,否则返回false。


输入样例1:如下图



输出样例1:


Yes


输入样例2:如下图



输出样例2:


No


代码


#include <stdio.h>
#include <stdlib.h>
typedef enum { false, true } bool;
typedef int ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};
BinTree BuildTree(); /* 由裁判实现,细节不表 */
bool IsBST ( BinTree T );
int main()
{
    BinTree T;
    T = BuildTree();
    if ( IsBST(T) ) printf("Yes\n");
    else printf("No\n");
    return 0;
}
/* 你的代码将被嵌在这里 */
bool IsBST(BinTree T)
{
  BinTree p;
  if (!T)   // 树为空
    return true;
  if (!T->Left && !T->Right)  // 只有根节点
    return true;
  p = T->Left;  // 先向左查
  if (p)
  {
    while (p->Right)//左子树的最大值在右下角
      p = p->Right;
    if (p->Data > T->Data)
      return false;
  }
  p = T->Right; // 再向左查
  if (p)
  {
    while (p->Left)//右子树的最小值在左下角
      p = p->Left;
    if (p->Data < T->Data)
      return false;
  }
  return 
    IsBST(T->Left) && IsBST(T->Right);  // 运用递归再查每个左右子树
}


编程题


7-1 是否同一棵二叉搜索树 (25分)


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


代码


#include<iostream>
#include<queue>
using namespace std;
struct BSTNode {
  //数据域
  int val;
  //指针域
  BSTNode *left,
    *right;
  //节点的构造
  BSTNode(int v)
  {
    val = v;
    left = NULL;
    right = NULL;
  }
};
//BST的数据结构
class BST {
private:
  BSTNode *root;
public:
  BST() { root = NULL; }
  //通过插入函数构造BST
  void insert(int n);
  //比较另一棵BST与本树是否相同
  bool jugde(BST t);
};
void BST::insert(int n)
{
  BSTNode *p = root,
       *pp = NULL;
  while (p != NULL)
  {
    pp = p;
    if (p->val>n) p = p->left;
    else p = p->right;
  }
  BSTNode *t = new BSTNode(n);
  if (root != NULL)
    if (pp->val > n) pp->left = t;
    else pp->right = t;
  else root = t;
}
//通过层序遍历,对比
bool BST::jugde(BST t)
{
  BSTNode*t1 = root,
    *t2 = t.root;
  queue<BSTNode*>q1,q2;
  while (t1 != NULL && t2 != NULL)
  {
    if (t1->val != t2->val) return false;
    if ((t1->left != NULL && t2->left == NULL) || (t1->left == NULL && t2->left != NULL)|| (t1->right != NULL && t2->right == NULL) || (t1->right == NULL && t2->right != NULL)) return false;
    if ((t1->left != NULL && t2->left != NULL)) { q1.push(t1->left); q2.push(t2->left); }
    if ((t1->right != NULL && t2->right != NULL)) { q1.push(t1->right); q2.push(t2->right); }
    if (q1.size() != 0 && q2.size() != 0)
    {
      t1 = q1.front(); t2=q2.front();
      q1.pop(); q2.pop();
    }
    else t1 = NULL;
  }
  return true;
}
int main()
{
  int n, m;
  while (cin>>n,cin>>m)
  {
    BST bst;
    for (int i = 0; i < n; i++)
    {
      int num; cin >> num;
      bst.insert(num);
    }
    for (int i = 0; i < m; i++)
    {
      BST t;
      for(int j=0;j<n;j++)
      {
        int num; cin >> num;
        t.insert(num);
      }
      if (bst.jugde(t)) cout << "Yes" << endl;
      else cout << "No" << endl;
    }
  }
  return 0;
}
相关文章
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
1083 77
|
算法 Java
算法系列之数据结构-二叉搜索树
二叉查找树(Binary Search Tree,简称BST)是一种常用的数据结构,它能够高效地进行查找、插入和删除操作。二叉查找树的特点是,对于树中的每个节点,其左子树中的所有节点都小于该节点,而右子树中的所有节点都大于该节点。
618 22
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
610 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
570 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
C语言 C++ 容器
【数据结构】二叉搜索树(二叉排序树)
本文介绍了二叉搜索树(Binary Search Tree, BST)的定义、实现及其性能分析。二叉搜索树是一种特殊的二叉树,其特点是左子树所有节点值小于根节点值,右子树所有节点值大于根节点值,且每个子树也满足此特性。文中详细讲解了BST的节点结构、插入、查找、删除等操作的实现,并通过C++代码展示了这些功能。此外,还讨论了BST的性能:在理想情况下,时间复杂度接近O(logN),但在最坏情况下可能退化为O(N)。为了提高效率,后续将学习自平衡二叉搜索树如AVL树和红黑树。掌握BST有助于理解STL中的set和map容器。感谢阅读,欢迎点赞支持。
1553 9
|
存储 人工智能 算法
【C++数据结构——图】最短路径(头歌教学实验平台习题) 【合集】
任务描述 本关任务:编写一个程序,利用Dijkstra算法,实现带权有向图的最短路径。 相关知识 为了完成本关任务,你需要掌握:Dijkst本关任务:编写一个程序,利用Dijkstra算法,实现带权有向图的最短路径。为了完成本关任务,你需要掌握:Dijkstra算法。带权有向图:该图对应的二维数组如下所示:Dijkstra算法:Dijkstra算法是指给定一个带权有向图G与源点v,求从v到G中其他顶点的最短路径。Dijkstra算法的具体步骤如下:(1)初始时,S只包含源点,即S={v},v的距离为0。
290 15
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
548 12
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
299 10
|
算法 C++
【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
【数据结构——图】最小生成树(头歌实践教学平台习题)目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:【合集】任务描述 本关任务:编写一个程序求图的最小生成树。相关知识 为了完成本关任务,你需要掌握:1.建立邻接矩阵,2.Prim算法。建立邻接矩阵 上述带权无向图对应的二维数组,根据它建立邻接矩阵,如图1建立下列邻接矩阵。注意:INF表示无穷大,表示整数:32767 intA[MAXV][MAXV];Prim算法 普里姆(Prim)算法是一种构造性算法,从候选边中挑
295 10
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
735 10