【LeetCode】:二叉搜索树

相关概念:

 一棵二叉搜索树(BST)是以一棵二叉树来组织的,可以用链表数据结构来表示,其中,每一个结点就是一个对象,一般地,包含数据内容key和指向孩子(也可能是父母)的指针属性。如果某个孩子结点不存在,其指针属性值为空(NIL)。
二叉搜索树中的关键字key的存储方式总是满足二叉搜索树的性质:
设x是二叉搜索树中的一个结点。如果y是x左子树中的一个结点,那么会有y.key<=x.key;如果y是x右子树中的一个节点,那么有y.key>=x.key。

二叉搜索树查找:
顾名思义,二叉搜索树很多时候用来进行数据查找。这个过程从树的根结点开始,沿着一条简单路径一直向下,直到找到数据或者得到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;
    }
};

 

posted @ 2018-03-13 22:15  华不摇曳  阅读(306)  评论(0编辑  收藏  举报