二叉搜索树的范围和c语言,LeetCode0938: 二叉搜索树的范围和

描述:

给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。

二叉搜索树保证具有唯一的值。

示例 1:

输入:root = [10,5,15,3,7,null,18], L = 7, R = 15

输出:32

示例 2:

输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10

输出:23

提示:

树中的结点数量最多为 10000 个。

最终的答案保证小于 2^31。

解题思路:

递归算法的关键是要明确函数的「定义」是什么,然后相信这个定义,利用这个定义推导最终结果。

写树相关的算法,简单说就是,先搞清楚当前 root 节点该做什么,然后根据函数定义递归调用子节点,递归调用会让孩子节点做相同的事情。

二叉树题目的一个难点在于如何通过题目的要求思考出每一个节点需要做什么

二叉树解题策略

一 递归 二 队列 + 迭代 (层次遍历) 三 栈 + 迭代 (非递归遍历) 四 其它

三种基本的遍历方式,都可以用递归来实现。写递归算法的时候,需要注意递归退出条件以及递归操作的表达。

根据二叉搜索树的特性

自己的解法实现

def rangeSumBST3(self, root, L, R):

from collections import deque

if not root: return 0

queue, res = deque([root]), 0

while queue:

node = queue.popleft()

if node:

if L <= node.val <= R:

res += node.val

if L < node.val:

queue.append(node.left)

if node.val < R:

queue.append(node.right)

return res

网上比较优秀的解法

解法一

方法一:深度优先搜索 我们对树进行深度优先搜索,对于当前节点 node,如果 node.val 小于等于 L,那么只需要继续搜索它的右子树;如果 node.val 大于等于 R,那么只需要继续搜索它的左子树;如果 node.val 在区间 (L, R) 中,则需要搜索它的所有子树。

def rangeSumBST(self, root, L, R):

def dfs(node):

if node:

if L <= node.val <= R:

self.res += node.val

if L < node.val:

dfs(node.left)

if node.val < R:

dfs(node.right)

self.res = 0

dfs(root)

return self.res

解法二

迭代实现深度优先搜索

def rangeSumBST2(self, root, L, R):

if not root: return 0

stack, res = [root], 0

while stack:

node = stack.pop()

if node:

if L <= node.val <= R:

res += node.val

if L < node.val:

stack.append(node.left)

if node.val < R:

stack.append(node.right)

return res

解法三

1、判断节点的值是否在L,R区间内,是的话,递归累加节点的值 2、如果节点的值小于L,递归查找右子树;如果节点的值大于R,递归查找其左子树

def rangeSumBST4(self, root, L, R):

if not root:

return 0

else:

if root.val > R:

return self.rangeSumBST(root.left, L, R)

elif root.val < L:

return self.rangeSumBST(root.right, L, R)

else:

return root.val + self.rangeSumBST(root.left, L, R) + self.rangeSumBST(root.right, L, R)

相关知识总结和思考

相关知识:

BFS:广度/宽度优先。其实就是从上到下,先把每一层遍历完之后再遍历一下一层。

可以使用Queue的数据结构。我们将root节点初始化进队列,通过消耗尾部,插入头部的方式来完成BFS。

二叉搜索树(BST)的特性:

若它的左子树不为空,则所有左子树上的值均小于其根节点的值

若它的右子树不为空,则所有右子树上的值均大于其根节点的值

它的左右子树也分别为二叉搜索树

递归与迭代的区别

递归:重复调用函数自身实现循环称为递归; 迭代:利用变量的原值推出新值称为迭代,或者说迭代是函数内某段代码实现循环;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值