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的主要内容,如果未能解决你的问题,请参考以下文章