leetcode算法总结 —— DFS之BST(二叉搜索树)

概述

二叉搜索树(Binary Search Tree,简称 BST)是一种很常用的的二叉树。它的定义是:一个二叉树中,任意节点的值要大于左子树所有节点的值,且要小于右边子树的所有节点的值。
二叉搜索树查找时间复杂度为O(logN)跟二分查找一样,速度接近O(1),非常快

BST性质

BST的性质:如果当前节点值大于target,则去左子树查找,否则就去右子树查找,这样我们就利用了二叉搜索树的性质不需要遍历所有节点了

    void dfs(TreeNode *root) {
    
    
        if(root == nullptr) return;
        if(root->val == target) {
    
    
            node = root;
            return;
        }
        if(root->val > target) {
    
     //如果当前节点值大于target,则去左子树查找,否则就去右子树查找,这样我们就利用了二叉搜索树的性质不需要遍历所有节点了
            dfs(root->left);
        } else {
    
    
            dfs(root->right);
        }
    }
}
    1. 二叉搜索树中的搜索
    1. 最接近的二叉搜索树值(同700)
    1. 二叉搜索树的范围和(同700)
    1. 二叉搜索树的最近公共祖先

BST进行中序遍历

BST的重要的一个性质就是中序遍历BST得到的是一个升序数组。所以BST考虑使用中序遍历来解决一些可能排序问题.
而反向中序遍历,右根左,得到的就是降序数组,也可以解决一些问题.

    void dfs(TreeNode* root)
    {
    
    
        if (root == nullptr)
            return;

        dfs(root->right);
        //这里的处理会依次遍历从小到大的数,也就是第一次遍历到的节点是最小值
    
        dfs(root->left);
    }

所以从这里看出,中序遍历,在两个递归中间处理事件,这个处理事件的节点的顺序就是左根右,如果是前序遍历就是根左右的顺序。

    1. 验证二叉搜索树(通过中序递增判断,比较当前值和前一个值,若违反规则则不是二叉搜索树)
    1. 二叉搜索树中的众数(和前一个数相等则计数)
    1. 二叉搜索树的最小绝对差(和前一个值计算最小差)
    1. 恢复二叉搜索树(和前一个值比较看出错的位置)
    1. 二叉搜索树中第K小的元素
    1. 两数之和 IV - 输入 BST
    1. 二叉搜索树迭代器

反向中序(降序排列)

  • 剑指 Offer 54. 二叉搜索树的第k大节点
    1. 把二叉搜索树转换为累加树(反向中序)

BST改变结构

一旦涉及“改”操作,也就是插入或者删除,函数就要返回 TreeNode 类型,并且对递归调用的返回值进行接收。

    TreeNode* dfs(TreeNode* root) {
    
    
        //如果当前值大于target则向左遍历,如果为空则插入该节点
        if(root == nullptr)  return new TreeNode(target); //此时return就不继续遍历了
        //如果当前值大于target则向左遍历,如果不为空
        //当前节点左节点指向左子树返回的左子节点
        if(curVal > target) {
    
    
            root->left = dfs(root->left);
        }
        else {
    
    
            root->right = dfs(root->right); 
        }
        //向父类返回当前节点
        return root;
    }
    1. 二叉搜索树中的插入操作(增)
    1. 删除二叉搜索树中的节点(删)
    1. 修剪二叉搜索树(改)

猜你喜欢

转载自blog.csdn.net/chongbin007/article/details/112094903
今日推荐