相关概念:
一棵二叉搜索树(BST)是以一棵二叉树来组织的,可以用链表数据结构来表示,其中,每一个结点就是一个对象,一般地,包含数据内容key和指向孩子(也可能是父母)的指针属性。如果某个孩子结点不存在,其指针属性值为空(NIL)。
二叉搜索树中的关键字key的存储方式总是满足二叉搜索树的性质:
设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么会有y.key<=x.key;如果y是x右子树中的一个节点,那么有y.key>=x.key。
二叉搜索树查找:
顾名思义,二叉搜索树很多时候用来进行数据查找。这个过程从树的根结点开始,沿着一条简单路径一直向下,直到找到数据或者得到NIL值。
顾名思义,二叉搜索树很多时候用来进行数据查找。这个过程从树的根结点开始,沿着一条简单路径一直向下,直到找到数据或者得到NIL值。
如下图所示:
由图可以看出,对于遇到的每个结点x,都会比较x.key与k的大小,如果相等,就终止查找,否则,决定是继续往左子树还是右子树查找。因此,整个查找过程就是从根节点开始一直向下的一条路径,若假设树的高度是h,那么查找过程的时间复杂度就是O(h)。
问题描述:
一:Minimum Absolute Difference in BST(BST中的最小绝对差值)
Given a binary search tree with non-negative values, find the minimum absolute difference between values of any two nodes.
给定一个带有非负值的二叉搜索树,找到任意两个节点值之间的最小绝对差值
Example:
Input: 1 3 / 2 Output: 1 Explanation: The minimum absolute difference is 1, which is the difference between 2 and 1 (or between 2 and 3).
Note: There are at least two nodes in this BST.
解答:
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: //非递归 int getMinimumDifference2(TreeNode* root) { stack<TreeNode*> s; TreeNode *p = root; int value = INT_MAX, tmp = INT_MAX; while (p || !s.empty()) { while (p) { s.push(p); p = p->left; } p = s.top(); s.pop(); if (tmp != INT_MAX){ value = min(abs(p->val - tmp),value); } tmp = p->val; p = p->right; } return value; } //递归 void helper(TreeNode *root, int &prev, int &md) { if(!root) { return; } helper(root->left, prev, md); if(prev != INT_MAX){ md = min(md, abs(root->val - prev)); } prev = root->val; helper(root->right, prev, md); } int getMinimumDifference(TreeNode* root) { int md = INT_MAX; int prev = INT_MAX; helper(root, prev, md); return md; } };