题目
题解
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
void dfs(struct TreeNode* root, int* gap){
if(root == NULL) return;
struct TreeNode* flag;
//左树最右
if(root->left != NULL){
flag = root->left;
while(flag->right!=NULL){
flag = flag->right;
}
*gap = abs(root->val-flag->val)<*gap? abs(root->val-flag->val):*gap;
}
//右树最左
if(root->right != NULL){
flag = root->right;
while(flag->left!=NULL){
flag = flag->left;
}
*gap = abs(root->val-flag->val)<*gap? abs(root->val-flag->val):*gap;
}
if(root->left != NULL) dfs(root->left,gap);
if(root->right != NULL) dfs(root->right,gap);
}
int getMinimumDifference(struct TreeNode* root){
int * gap = (int*)malloc(sizeof(int));
*gap = 10001;
dfs(root,gap);
return *gap;
}
要点
求绝对值使用abs函数。
在本题代码中:
由于是自上而下深度优先遍历,因此在考虑二叉排序树的某一结点时,最接近的比它小的是左子树最右叶结点,最接近的比它大的是右子树的最左叶结点。
在理论中:
对于二叉排序树或者说二叉搜索树中的任一结点,
其在中序序列中的前驱结点是:
①若有左子树,左子树最右。
②否则往上找,找到符合本结点位于该结点右子树中的第一个祖先结点。
其在中序序列中的后继结点是:
①若有右子树,右子树最左。
②否则往上找,找到符合本结点位于该结点左子树中的第一个祖先结点。