TOJ 1003

Posted kannyi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TOJ 1003相关的知识,希望对你有一定的参考价值。

描述

给定一棵二叉搜索树(Binary Search Tree,BST),求其两结点元素之差的最小绝对值。

BST定义:

二叉搜索树,又称为二叉排序树,它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。

二叉树节点定义如下:

struct TreeNode {

    int val;

    struct TreeNode *left;

    struct TreeNode *right;

};

题目部分代码已经完成,您只需要补充并提交以下函数:

int getMinimumDifference(struct TreeNode* root);

二叉搜索树图例:技术分享图片

输入

输入第一行为整数n,表示关键字数目(n<500)。

第二行有n个整数,表示节点的关键字,按照该关键字顺序构建一棵BST。

输出

输出两结点元素之差的最小绝对值。

样例输入

3
1 3 2

样例输出

1

题解

BST使用中序遍历得到升序排序,而最小的绝对差肯定是发生在两个相邻数字,所以只要遍历过程相减并且对比最小值即可。

#include<bits/stdc++.h>
using namespace std;
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};
void Insert(TreeNode**root,TreeNode*t)
{
    if(*root==NULL)
        *root=t;
    else if(t->val < (*root)->val)
        Insert(&(*root)->left,t);
    else Insert(&(*root)->right,t);
}
TreeNode*creatBst()
{
    TreeNode*root=NULL,*t;
    int x,i,n;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&x);
        t=(TreeNode*)malloc(sizeof(TreeNode));
        t->val=x;
        t->left=NULL;
        t->right=NULL;
        Insert(&root,t);
    }
    return root;
}
int m[505],s;
void insave(struct TreeNode*root)
{
    if(!root)
        return;
    insave(root->left);
    m[s++]=root->val;
    insave(root->right);
}
int getMinimumDifference(struct TreeNode* root)
{
    int i;
    if(!root)
        return 0;
    insave(root);
    int minn=99999999;
    for(i=1;i<s;i++)
    {
        if(abs(m[i-1]-m[i])<minn)
            minn=abs(m[i-1]-m[i]);
    }
    return minn;
}
int main()
{
    TreeNode*t=creatBst();
    printf("%d\\n",getMinimumDifference(t));
    return 0;
}

以上是关于TOJ 1003的主要内容,如果未能解决你的问题,请参考以下文章

TOJ 5347: 数据结构实验:删除链表元素

TOJ1290 Poker Hands 模拟题

TOJ4505: KOSARE

为啥片段中的晶圆厂不响应点击事件?

TOJ礼品兑换 (多重背包恰好装满)

TOJ4244: Sum