zoukankan      html  css  js  c++  java
  • 【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;
        }
    };
  • 相关阅读:
    《Code Complete》ch.18 表驱动法
    libevent I/O示例
    Unity3d 与 Objective-C 数据交互,持续更新中
    progress 相关事件 异步 ajax
    数据结构chapter01_C++基础
    vue环境搭建
    时间复杂度和空间复杂度
    linux内核数据结构之链表
    linux内核数据结构之kfifo
    c++ iterator(迭代器)分类及其使用
  • 原文地址:https://www.cnblogs.com/ygh1229/p/8563120.html
Copyright © 2011-2022 走看看