博客
关于我
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 函数初始化一个新节点。
  • 插入节点:insert1 和 insert2 分别用于构建二叉排序树和镜像树。
  • 前序遍历:preOrder 记录前序访问顺序。
  • 主函数:读取输入,构建树并进行遍历,比较结果输出判断。
  • 这种方法通过构建两棵树并比较前序结果,确保输入序列符合要求。另外,利用后序遍历反转的方法可以简化镜像树的构建过程,提高效率。

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

    你可能感兴趣的文章
    python 录音左右声道_Python分离立体声wav压缩文件的左右声道
    查看>>
    Python 循环异或对文件进行加解密
    查看>>
    Python开发环境搭建(附VMware安装包及虚拟机环境)
    查看>>
    python 微信扫码登录_python实现微信第三方网站扫码登录(Django)
    查看>>
    Python 快速下载依赖
    查看>>
    python实现非参数统计的Cochran检验 (附完整源码)
    查看>>
    Python 手写数字识别-3-sklearn中的几种算法
    查看>>
    Python 打开文件注意事项
    查看>>
    python 批量修改文件名_python windows下批量修改文件名
    查看>>
    Python 抓取网页乱码问题 以及EXCEL乱码
    查看>>
    python 抓取网页内容
    查看>>
    python 按照当前日期创建文件
    查看>>
    Python 接口并发测试详解
    查看>>
    Python 接口自动化 —— requests框架
    查看>>
    python 接口自动化数据结构(如列表、字典、元组)
    查看>>
    Python 接口自动化测试中的深拷贝与浅拷贝~
    查看>>
    Python 接口自动化测试中的高阶函数
    查看>>
    python 控制 cmd 命令行颜色
    查看>>
    Python 操作 Azure Blob Storage
    查看>>
    Python 操作 Excel 全攻略 | 包括读取、写入、表格操作、图像输出和字体设置
    查看>>