【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;
}

猜你喜欢

转载自www.cnblogs.com/kannyi/p/9004681.html
今日推荐