博客
关于我
PAT--1043 Is It a Binary Search Tree(二叉排序树的建立与判定)
阅读量:197 次
发布时间:2019-02-28

本文共 1917 字,大约阅读时间需要 6 分钟。

如何判断一个输入序列是否是一颗二叉排序树的前序序列或是其镜像树的前序序列?以下是详细的解决方法。

方法一:构建两棵树并进行前序遍历

  • 构建二叉排序树和镜像树

    • 二叉排序树:按照递增顺序插入节点。
    • 镜像树:将左子树和右子树的顺序调换,插入时右边为左,左边为右。
  • 前序遍历

    • 对二叉排序树和镜像树分别进行前序遍历,记录结果。
    • 比较输入序列与两棵树的前序结果,如果匹配则输出“YES”,否则输出“NO”。
  • 方法二:利用后序遍历的反转

  • 构建二叉排序树

    • 按照递增顺序插入节点。
  • 后序遍历

    • 记录节点的后序访问顺序。
  • 生成镜像树的前序序列

    • 将二叉排序树的后序结果反转,得到镜像树的前序序列。
  • 比较

    • 输入序列与反转后的后序结果进行比较,若匹配则输出“YES”,否则输出“NO”。
  • 代码实现

    #include 
    #include
    #include
    using namespace std;struct Node { Node* lchild, *rchild; int num;};vector
    inpVec;Node* create(int v) { Node* root = new Node(); root->lchild = root->rchild = NULL; root->num = v; return root;}Node* insert1(Node* root, int v) { if (!root) return create(v); if (v < root->num) root->lchild = insert1(root->lchild, v); else root->rchild = insert1(root->rchild, v); return root;}Node* insert2(Node* root, int v) { if (!root) return create(v); if (v > root->num) root->lchild = insert2(root->lchild, v); else root->rchild = insert2(root->rchild, v); return root;}void preOrder(Node* root, vector
    & vec) { vec.push_back(root->num); if (root->lchild) preOrder(root->lchild, vec); if (root->rchild) preOrder(root->rchild, vec);}int main() { int n; scanf("%d", &n); Node* root1 = NULL, *root2 = NULL; for (int i = 0; i < n; ++i) { int k; scanf("%d", &k); inpVec.push_back(k); root1 = insert1(root1, k); root2 = insert2(root2, k); } vector
    preVec, mipreVec; preOrder(root1, preVec); preOrder(root2, mipreVec); if (inpVec == preVec) { printf("YES\n"); } else if (inpVec == mipreVec) { printf("YES\n"); } else { printf("NO\n"); } return 0;}

    代码解释

  • 结构体Node 包含左、右孩子和数值,用于构建树。
  • 创建节点create 函数初始化一个新节点。
  • 插入节点insert1insert2 分别用于构建二叉排序树和镜像树。
  • 前序遍历preOrder 记录前序访问顺序。
  • 主函数:读取输入,构建树并进行遍历,比较结果输出判断。
  • 这种方法通过构建两棵树并比较前序结果,确保输入序列符合要求。另外,利用后序遍历反转的方法可以简化镜像树的构建过程,提高效率。

    转载地址:http://inrn.baihongyu.com/

    你可能感兴趣的文章
    Openlayers中使用Cluster+Overlay实现点击单个要素和聚合要素时显示不同弹窗
    查看>>
    Openlayers中使用Cluster实现点位元素重合时动态聚合与取消聚合
    查看>>
    Openlayers中使用Cluster实现缩放地图时图层聚合与取消聚合
    查看>>
    Openlayers中使用Image的rotation实现车辆定位导航带转角(判断车辆图片旋转角度)
    查看>>
    Openlayers中加载Geoserver切割的EPSG:900913离线瓦片图层组
    查看>>
    Openlayers中多图层遮挡时调整图层上下顺序
    查看>>
    Openlayers中将某个feature置于最上层
    查看>>
    Openlayers中点击地图获取坐标并输出
    查看>>
    Openlayers中设置定时绘制和清理直线图层
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    Openlayers实战:modifystart、modifyend互动示例
    查看>>
    Openlayers实战:判断共享单车是否在电子围栏内
    查看>>
    Openlayers实战:加载Bing地图
    查看>>
    Openlayers实战:绘制图形,导出geojson文件
    查看>>
    Openlayers实战:绘制图形,导出KML文件
    查看>>
    Openlayers实战:绘制多边形,导出CSV文件
    查看>>
    Openlayers实战:绘制带箭头的线
    查看>>
    Openlayers实战:输入WKT数据,输出GML、Polyline、GeoJSON格式数据
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(11/20):显示带箭头的线段轨迹,箭头居中
    查看>>