是二叉搜索数吗?

6-1 是二叉搜索树吗?

作者 周强

单位 青岛大学

请实现一个函数,打印给定二叉树的中序遍历序列并判定他是否是一棵二叉搜索树(Binary Search Tree)。

(提示:空树是二叉搜索树)

函数接口定义:

int isBST(struct BinTree* bt);

其中二叉树定义如下:

struct BinTree{
    int data;
    struct BinTree* left;
    struct BinTree* right;
};

题目保证二叉树不超过200个结点,结点数值在整型int范围内且各不相同。

函数打印二叉树的中序遍历序列,每个元素占一行。对于空树,函数不打印任何内容。

如果给定的树是二叉搜索树,函数返回1,否则返回0

裁判测试程序样例:

#include "stdio.h"
#include "stdlib.h"
struct BinTree{
    int data;
    struct BinTree* left;
    struct BinTree* right;
};
struct BinTree* createNode(int item){ // 创建结点
    /* 函数实现细节省略 */
}
struct BinTree* findNode(struct BinTree* bt, int item){  // 查找结点
    /* 函数实现细节省略 */
}
int insert(struct BinTree*bt, int parent, int dir,  int item){  // 插入结点
   /*  实现细节仅供参考 */
    struct BinTree* tmp;
    tmp = findNode(bt, parent);
    if(!tmp) return 0;
    if(dir == 0){
        if(tmp->left) return 0;
        tmp->left = createNode(item);
        if(tmp->left == NULL) return 0;
    } else{
        if(tmp->right) return 0;
        tmp->right = createNode(item);
        if(tmp->right == NULL) return 0;
    }
    return 1;
}
struct BinTree* createBinTree(){  // 创建二叉树
   /*  实现细节仅供参考 */
    int total, data;
    scanf("%d", &total);
    if(total == 0) return NULL;
    scanf("%d", &data);
    struct BinTree* bt;
    bt = createNode(data);
    if(!bt) return NULL;
    int parent,dir;
    for(int i=1; i<total; i++){
        scanf("%d%d%d",&parent, &dir, &data);
        insert(bt,parent, dir, data);
    }
    return bt;
}
int isBST(struct BinTree* bt);  
int main(){
    struct BinTree* bt;
    bt = createBinTree();
    printf("%s\n", isBST(bt) ? "Yes" : "No" );
    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

 

48bc7ca37a436ee0fdded0ba4c3cee19.png


对于此图的二叉树及样例测试程序规定的输入格式:

3
20
20 0 10
20 1 25

Sample Output:

10
20
25
Yes

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int isBST(struct BinTree* bt)
{
    int a=1,b=1;
    if(bt==NULL)return 1;
    if(bt->left)a=isBST(bt->left);
    printf("%d\n",bt->data);
    if(bt->right)b=isBST(bt->right);
    if(bt->left&&bt->left->data>bt->data)a= 0;
    if(bt->right&&bt->right->data<bt->data)b= 0;
    if(a&&b)
        return 1;
    else return 0;
}

 

 

  • 21
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
构造一个最优二叉搜索树的算法被称为动态规划算法,具体思路如下: 1. 首先,将节点按照键值的大小排序,建立一棵空树。 2. 假设有n个节点,将它们编号为1到n。对于每个子树,计算其中所有节点的概率之和,以及左右子树中节点的概率之和。 3. 对于每个子树,找到其中概率和最小的节点作为根节点。 4. 以根节点作为分界点,将子树划分为左右两个子树。对于左右子树,重复步骤2和3,直到所有节点都被加入到树中。 5. 最后,构造出的树即为最优二叉搜索树。 下面是代码实现的主要思路: 1. 定义一个二维组dp,其中dp[i][j]表示从第i个节点到第j个节点构造的最优二叉搜索树的期望搜索。 2. 初始化dp组,对于只含一个节点的树,期望搜索即为该节点的概率。 3. 对于包含多个节点的子树,使用上述算法进行动态规划计算,更新dp组。 4. 最后,根据dp组构建最优二叉搜索树。 下面是伪代码: ``` function optimal_bst(p, q, n): dp = [[0] * (n + 1) for _ in range(n + 1)] # 初始化dp组 for i in range(n): dp[i][i] = q[i] for l in range(2, n + 1): for i in range(n - l + 2): j = i + l - 1 dp[i][j] = float('inf') w = sum(p[i:j+1]) + sum(q[i:j+1]) for r in range(i, j + 1): t = dp[i][r - 1] + dp[r + 1][j] + w if t < dp[i][j]: dp[i][j] = t # 构建最优二叉搜索树 root = build_bst(dp, p, q, 0, n - 1) return root def build_bst(dp, p, q, i, j): if i > j: return None k = find_root(dp, i, j) node = TreeNode(k) node.left = build_bst(dp, p, q, i, k - 1) node.right = build_bst(dp, p, q, k + 1, j) return node def find_root(dp, i, j): min_cost = float('inf') root = -1 for k in range(i, j + 1): cost = dp[i][k - 1] + dp[k + 1][j] if cost < min_cost: min_cost = cost root = k return root ``` 其中,p和q分别为节点的概率和其它节点被搜索的概率,n为节点。最终返回构造出的最优二叉搜索树的根节点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值