首页 > 其他分享 >day40_0530.二叉搜索树的最小绝对差

day40_0530.二叉搜索树的最小绝对差

时间:2022-12-31 21:44:09浏览次数:42  
标签:0530 pre TreeNode cur traversal result 二叉 root day40

  • 递归1----不用数组
  • 递归2------借助数组
  • 迭代
class Solution {
public:
    TreeNode* pre = NULL;
    int result = INT_MAX;
    void traversal(TreeNode* root ) {
        if (root == NULL) return;
        traversal(root->left ); 
        if (pre != NULL) 
            result = min (result, (root->val - pre->val));
        pre = root;
        traversal(root->right );
    }
    int getMinimumDifference(TreeNode* root) {
        traversal(root );
        return result;
    }
};
  • 以上是 卡哥Ac
  • 我能想到这个思路 就是在上一个题目 0098验证二叉搜索树的 迭代版本--找树最左边结点为最小值 的基础上 只需要添加一个判断即可
    • 也就是说 可以再设置一个全局变量 result = INT_MAX 然后额外一个递归函数 在pre = root之前就进行比较较小值并赋值
    • 但是我写的代码 还是有差距的 我没有想到把result设置成全局变量 而是打算让result作为递归函数的输入参数 wa代码见下
class Solution {
public:
    TreeNode* pre = NULL;
    void traversal(TreeNode* root, int result) {
        if (root == NULL) return;
        traversal(root->left, result); 
        if (pre != NULL) 
            result = min (result, (root->val - pre->val));
        pre = root;
        traversal(root->right, result);
    }
    int getMinimumDifference(TreeNode* root) {
        int result = INT_MAX;
        traversal(root, result);
        return result;
    }
};
  • 无论什么测试用例 结果都是2147483647 应该是INT_MAX的值 也就是说 虽然进入traversal(root, result)函数 但是并没有对result的值进行修改 我猜测可能是因为值传递而地址传递的原因 目前还不会改正错误 下次再看

  • 递归2----借助数组

class Solution {
public:
    vector<int> vec;
    void traversal(TreeNode* root) {
        if (root == NULL) return;
        traversal(root->left); 
        vec.push_back(root->val); 
        traversal(root->right);
    }
    int getMinimumDifference(TreeNode* root) {
        int result = INT_MAX;
        traversal(root);
        if (vec.size() <= 1)    return 0;
        for (int i = 1; i < vec.size(); i++) {
            result = min(result, vec[i] - vec[i - 1]);
        }
        return result;
    }
};
  • !!!二叉搜索树 经过中序遍历 即得有序数组 将问题 求二叉搜索树的最值 转换为 求有序数组的最值 这个方法最直观最简单
  • 迭代法-----在0098验证二叉搜索树的 迭代版本基础上 加两行代码
class Solution {
public:
    int getMinimumDifference(TreeNode* root) {
        stack<TreeNode*> 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;
    }
};
  • 迭代版本 虽然不是最直观的 但理解了模板的话是最好改的

标签:0530,pre,TreeNode,cur,traversal,result,二叉,root,day40
From: https://www.cnblogs.com/deservee/p/17017413.html

相关文章

  • leetcode-563. 二叉树的坡度
    563.二叉树的坡度-力扣(Leetcode)坡度的计算需要4个数左子树所有节点的和右子树所有结点的和左子树的坡度右子树的坡度左子树与右子树节点差值的绝对值为当前节点......
  • 二叉搜索树中第K小的元素
    二叉搜索树中第K小的元素https://leetcode.cn/problems/kth-smallest-element-in-a-bst/解题思路:生序排序,然后找第K个元素BST的中序遍历就是升序排序的结果let......
  • STL----multiset,平衡二叉数
    《作用》查找,删除,增加节点基本上都是O(logn)多用在比如:vector或一般数组,我们知道如果用这些数据结构要维护一个序列有序,当我们要插入一个数到某个特定的位置那么最坏会......
  • 三化二叉树trick
    三选一化二叉套路概述这个套路是针对某一建模题的。三选一其实可以扩展到N选一,模型具体如下。发现某种状态可以扩展出\(N\)个状态,且有一个状态相较而言比较特殊(如其他......
  • leetcode-543. 二叉树的直径
    543.二叉树的直径-力扣(Leetcode)深度优先遍历,每个节点的直径等于左子树的最大深度加上右子树的最大深度,取一个最大值即可/***Definitionforabinarytreenode.......
  • [arXiv18]更快的基于非二叉化自底向上策略的转移系统成分句法分析
    原文链接:​​FasterShift-ReduceConstituentParsingwithaNon-Binary,Bottom-UpStrategy​​论文地址:​​FasterShift-ReduceConstituentParsingwithaNon-......
  • 四、数据结构第四节——二叉树(知识点)
    四、数据结构第四节——二叉树今天开启美妙的二叉树的学习~~~“树”是我们第一次见到的”非线性”的数据结构。二叉树:是树上每个节点都只有两个子节点的简单的树。知......
  • 二叉树
    二叉树的概念树,有三个比较相似的概念:高度,深度,层;它们的定义为:节点的高度:节点到叶子节点的最长路径节点的深度:根节点到这个节点所经历的边的个数节点的层数:节点的深度+......
  • 关于二叉树深度 和 高度的问题
    根节点的高度=最大深度(后序遍历)104.二叉树的最大深度publicintmaxDepth(TreeNoderoot){returngetDepth(root);}publicintgetDepth(TreeNo......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉搜索树序列
    题目:从左向右遍历一个数组,通过不断将其中的元素插入树中可以逐步地生成一棵二叉搜索树。给定一个由不同节点组成的二叉搜索树 root,输出所有可能生成此树的数组。 示例1:......