Day114 | 灵神 | 二叉树 | 二叉搜索树的最小绝对差

Day114 | 灵神 | 二叉树 | 二叉搜索树的最小绝对差

2476.二叉搜索树最近节点查询

2476. 二叉搜索树最近节点查询 - 力扣(LeetCode)

思路:

这道题目拿到手就觉得在树中递归查找太费劲了,还是转化为有序数组在数组中使用二分比较方便

1.中序遍历root得到有序数组arr

2.二分查找queries[i]即可找到最大最小值

C++ 中 lower_bound 与 upper_bound 函数详解-CSDN博客

class Solution {
public:
    vector<int> arr;
    //1.得到有序数组
    void tra(TreeNode *t)
    {
        if(t==nullptr)
            return ;
        tra(t->left);
        arr.push_back(t->val);
        tra(t->right);
    }
    vector<vector<int>> closestNodes(TreeNode* root, vector<int>& queries) {
        tra(root);
        vector<vector<int>> res;
        for(int i=0;i<queries.size();i++)
        {
            int maxVal = -1, minVal = -1;
            //2.二分查找queries[i]
            auto it = lower_bound(arr.begin(), arr.end(), queries[i]);
            //找到了it,是第一个不小于queries[i]的数
            if (it != arr.end()) {
                maxVal = *it;
                //如果相等,那么最大最小值都是it
                if (*it == queries[i]) {
                    minVal = *it;
                    res.push_back({minVal, maxVal});
                    continue;
                }
            }
            //如果it和queries[i]不相等 最小值就是it的前一个元素即--it,不等于begin是为了防止迭代器越界
            if (it != arr.begin()) {
                minVal = *(--it);
            }
            res.push_back({minVal, maxVal});
        }
        return res;
    }
};
### 二叉树二叉搜索树的区别 #### 结构特点 二叉树是一种每个节点最多有两个子节点的数据结构。而二叉搜索树则是在此基础上增加了特定的排序属性:如果其左子树不为空,则左子树上的所有结点的值均小于它的根结点的值;同样地,若右子树不为空,则右子树上所有结点的值均大于它的根结点的值[^1]。 #### 平衡性质 值得注意的是,在某些情况下还会涉及到平衡的概念。例如,平衡二叉树(AVL树)不仅满足上述条件,而且任意一个节点的左右两个子树的高度差绝对值不超过1,这使得整个树保持相对均衡的状态[^3]。 --- ### 遍历方法对比 #### 基本遍历模式 对于一般的二叉树而言,存在三种常见的遍历方式——前序、中序和后序遍历。然而当讨论到二叉搜索树时,由于其中序遍历能够得到按升序排列的结果序列,因此这种遍历方式显得尤为重要[^2]。 #### 后序遍历实现 具体来看,针对二叉搜索树执行后序遍历时遵循如下逻辑:先处理左子树,接着转向右子树,最后才访问当前节点本身。下面给出了一段用于展示这一过程的C++代码片段: ```cpp void postOrder(TreeNode* node) { if (node == nullptr) return; postOrder(node->left); // 递归遍历左子树 postOrder(node->right); // 递归遍历右子树 std::cout << node->val << " "; // 输出节点值 } ``` 此函数接收指向某个`TreeNode`类型的指针作为参数,并按照定义好的规则完成相应的操作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值