坐落于亚洲之东方

坐落于亚洲之东方

【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和-LMLPHP
一、什么是二叉搜索树
二叉搜索树(BST,Binary Search Tree),也称二叉排序树或二叉查找树
二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质
非空左子树的所有键值小于其根结点的键值
非空右子树的所有键值大于其根结点的键值
左、右子树都是二叉搜索树
【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和-LMLPHP
上图值为10的结点的右子树为7,比10小,不满足条件2,所以这棵树不是二叉搜索树
【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和-LMLPHP
上图各个结点都满足条件,所以这棵树是二叉搜索树
【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和-LMLPHP
上图各个结点都满足条件,所以这棵树也是二叉搜索树
看完上面的介绍后,相信大家都对什么是二叉搜索树有了较为清晰的认识。接下来说一下二叉搜索树的一些基本操作
给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和
【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和-LMLPHP
输入:root = [10,5,15,3,7,null,18], low = 7, high = 15
输出:32
【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和-LMLPHP
【LeetCode刷题(数据结构与算法)】:二叉搜索树的范围和-LMLPHP
输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10
输出:23

方法:深度优先搜索

思路
按深度优先搜索的顺序计算范围和。记当前子树根节点为 root\textit{root}root,分以下四种情况讨论:
root 节点为空
返回 0
root 节点的值大于 high
由于二叉搜索树右子树上所有节点的值均大于根节点的值,即均大于 high,故无需考虑右子树,返回左子树的范围和
root 节点的值小于 low
由于二叉搜索树左子树上所有节点的值均小于根节点的值,即均小于low,故无需考虑左子树,返回右子树的范围和
root节点的值在[low,high] 范围内
此时应返回root 节点的值、左子树的范围和、右子树的范围和这三者之和

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */


int rangeSumBST(struct TreeNode* root, int low, int high){
    if(root==NULL)
    {
        return 0;
    }
    if(root->val>high)
    {
        return rangeSumBST(root->left,low,high);
    }
    if(root->val<low)
    {
        return rangeSumBST(root->right,low,high);
    }
    return root->val+rangeSumBST(root->left, low, high)
    +rangeSumBST(root->right,  low,  high);
}
10-19 06:38