博客
关于我
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/

    你可能感兴趣的文章
    NXLog采集windows日志配置conf文件
    查看>>
    ny540 奇怪的排序 简单题
    查看>>
    NYOJ -216 A problem is easy
    查看>>
    NYOJ 1066 CO-PRIME(数论)
    查看>>
    NYOJ 737:石子合并(一)(区间dp)
    查看>>
    nyoj 91 阶乘之和(贪心)
    查看>>
    nyoj------203三国志
    查看>>
    NYOJ-525 一道水题
    查看>>
    NYOJ127星际之门(一)
    查看>>
    nyoj58 最少步数
    查看>>
    N皇后问题
    查看>>
    N皇后问题
    查看>>
    n种方式教你用python读写excel等数据文件
    查看>>
    OAuth 2.0 MAC Tokens
    查看>>
    OAuth 及 移动端鉴权调研
    查看>>
    OAuth2 + Gateway统一认证一步步实现(公司项目能直接使用),密码模式&授权码模式
    查看>>
    OAuth2 Provider 项目常见问题解决方案
    查看>>
    OAuth2 vs JWT,到底怎么选?
    查看>>
    Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>