【Day-34慢就是快】代码随想录-二叉树-二叉搜索树的最小绝对差

给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。

思路

可以把二叉搜索树想象为有序数组,求差值。

递归

方法1:转换为有序数组再找最小差值

将二叉搜索树进行中序遍历得到的就是一个有序数组。

由于是有序数组,求最小差值就是相邻元素差值最小。

class Solution {
public:
    vector vec;
    void traversal(TreeNode* root){
        if(root == NULL) return ;
        traversal(root->left);
        vec.push_back(root->val);
        traversal(root->right);
    }
    int getMinimumDifference(TreeNode* root) {
        vec.clear();
        traversal(root);
        if(vec.size() < 2) return 0;
        int result = INT_MAX;
        for(int i=1;i

方法2:在搜索树中序遍历时就直接计算差值

【Day-34慢就是快】代码随想录-二叉树-二叉搜索树的最小绝对差_第1张图片

需要用一个pre节点记录一下cur节点的前一个节点。

class Solution {
public:
    int result = INT_MAX;
    TreeNode* pre = NULL;
    void traversal(TreeNode* cur){
        if(cur == NULL) return ;
        traversal(cur->left);
        if(pre != NULL){
            result = min(result, cur->val - pre->val);
        }
        pre = cur;
        traversal(cur->right);
    }
    int getMinimumDifference(TreeNode* root) {
        traversal(root);
        return result;
    }
};

迭代法

借助栈进行中序遍历的迭代。

class Solution {
public:
    int getMinimumDifference(TreeNode* root) {
        stack st;
        TreeNode* pre = NULL;
        TreeNode* cur = root;
        int result = INT_MAX;
        while(cur != NULL || !st.empty()){
            if(cur != NULL){
                st.push(cur);
                cur = cur->left;
            }
            else {
                cur = st.top();
                st.pop();
                if(pre != NULL){
                    result = min(result, cur->val - pre->val);
                }
                pre = cur;
                cur = cur->right;
            }
        }
        return result;
    }
};

你可能感兴趣的:(代码随想录,c++,算法)