PTA数据结构与算法 7-28 搜索树判断

如有不对,不吝赐教

下面进入正题:

对于二叉搜索树,我们规定任一结点的左子树仅包含严格小于该结点的键值,而其右子树包含大于或等于该结点的键值。如果我们交换每个节点的左子树和右子树,得到的树叫做镜像二叉搜索树。
现在我们给出一个整数键值序列,请编写程序判断该序列是否为某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,如果是,则输出对应二叉树的后序遍历序列。

输入格式:
输入的第一行包含一个正整数N(≤1000),第二行包含N个整数,为给出的整数键值序列,数字间以空格分隔。

输出格式:
输出的第一行首先给出判断结果,如果输入的序列是某棵二叉搜索树或某镜像二叉搜索树的前序遍历序列,则输出YES,否侧输出NO。如果判断结果是YES,下一行输出对应二叉树的后序遍历序列。数字间以空格分隔,但行尾不能有多余的空格。

输入样例1:
7
8 6 5 7 10 8 11

输出样例1:
YES
5 7 6 8 11 10 8

输入样例2:
7
8 6 8 5 10 9 11

输出样例2:
NO

这道题是对二叉搜索树或者其镜像树的判断,一种很容易想到的方法就是自己按照它的数据递归地来建一棵树,然后在来一遍后序遍历,我在这里给一种直接使用先序遍历来得到后序遍历以及判断的代码。

下面先给出代码,然后在逐条分析:

#include<stdio.h>

int pos;       //填充的位置
int mirror;    //是否是镜像树
int lastroot=-1;   //表示上一个根节点

int Judge(int *postOrder,int *data,int left,int right,int branch);
    //branch表示该子树是上一个节点的哪个个分支 初始节点为-1 左子树为0 右子树为1
int main(void)
{
   
   
    int N,i;
    int flag;       //是二叉搜索树或者镜像二叉搜索树
    scanf("%d",&N);
    int data[N];
    int postOrder[N];
    pos=N-1;

    for(i=0;i<N;i++)
      scanf("%d",data+i);       //输入数据

    if(N>1){
   
   
      if(data[0]<data[1])
        mirror=1;       //说明是镜像树
      flag=Judge(postOrder,data,0,N-1,-1);
    }
    else{
   
   
      flag=1;
      postOrder[0]=data[0
### PTA平台上数据结构算法相关的练习题 #### 题目特点概述 PTA平台提供了丰富的数据结构算法练习题,这些题目涵盖了多种经典的数据结构操作以及常见的算法设计思路。对于不同难度级别的选手来说都是很好的训练资源。 #### 具体实例分析 ##### BFS遍历图的表示方法 当处理具有大量节点的情况时,采用链表来代替矩阵作为存储方式能够有效减少内存占用并提高效率[^1]。尽管如此,在某些特定场景下直接利用矩阵实现可能会带来意想不到的速度优势。这表明选择合适的数据结构取决于具体应用场景的需求。 ```python from collections import deque def bfs_with_levels(graph, start_node): visited = set() queue = deque([(start_node, 0)]) while queue: current_node, level = queue.popleft() if current_node not in visited: print(f'Visiting node {current_node} at level {level}') visited.add(current_node) neighbors = graph[current_node] for neighbor in neighbors: queue.append((neighbor, level + 1)) ``` ##### 动态规划贪心策略的选择 面对涉及价值最大化的问题,如L2-003中的月饼分配问题,既可以考虑使用动态规划的方法求解,也可以尝试基于物品单位重量的价值来进行排序后的贪心选取方案[^2]。两种方法各有优劣,前者适合解决较为复杂的约束条件下的最优化问题;后者则适用于那些可以通过局部最优决策推导出全局最优解的情形。 ##### 搜索树构建及其验证 针对二叉搜索树这类特殊形式的树形结构,其定义要求左子树上所有节点的关键字均小于根节点关键字,而右子树上的所有节点关键字都大于等于根节点关键字。因此,在给定一组整数键值序列的情况下,可以根据上述性质逐个插入元素形成一棵可能存在的BST,并通过后续检验确认最终得到的结果是否满足该特性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值