給定二叉搜索樹的根結點 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。
首先是題意:這道題的意思就是,找出在給定左右節點範圍中的節點數的和。java
因此咱們能夠遍歷全部節點,因而咱們能夠使用遞歸。node
法一,使用遞歸可是方法做用與法二不一樣,做用寫在了代碼的第一句,法三就是用while循環,遍歷每一個節點函數
main函數:code
class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } //遞歸實現深度優先搜索 public class 二叉搜索樹的範圍和 { static int result; static int ans; public static void main(String[] args) { result = 0; //第一層 TreeNode node = new TreeNode(10); //第二層 node.left = new TreeNode(5); node.right = new TreeNode(15); //第三層 node.left.left = new TreeNode(3); node.left.right = new TreeNode(7); node.right.right = new TreeNode(18); //法一,遞歸可是方法做用與法二不一樣,遞歸實現深度優先遍歷: // dfs(node,7, 15); // System.out.println(result); //法二: // System.out.println(dfs2(node,7,15)); //法三,迭代實現深度優先遍歷: f3(node,7,15); System.out.println(ans); }
法一:遞歸
//當前節點是否能進入result的和,遍歷了全部節點 public static void dfs(TreeNode node, int l, int r) { if (node != null){ if (l <= node.val && node.val <= r) { result += node.val; } //這裏必需要遍歷每一個節點,因此須要node.val > l ,dfs(node.left,l,r) if (node.val > l) dfs(node.left,l,r); if (node.val < r) dfs(node.right,l,r); } }
法二:class
//該樹的知足範圍的和,,沒有遍歷全部節點 //若是當前節點的值小於left,和等於右子數之和 //若是當前節點的值大於right,和等於左子數之和 //若是當前節點的值在範圍裏,和等於右子數+左子樹之和+當前節點的值 private static int dfs2(TreeNode node, int l, int r) { if (node == null) { return 0; } if (node.val < l){ return dfs2(node.right,l,r); } if (node.val > r){ return dfs2(node.left,l,r); } return dfs2(node.left,l,r)+dfs2(node.right,l,r)+node.val; }
法三:搜索
//迭代實現深度優先遍歷,遍歷了全部節點 public static int f3(TreeNode root,int L, int R){ ans = 0; Stack<TreeNode> stack = new Stack(); stack.push(root); while (!stack.isEmpty()) { TreeNode node = stack.pop(); if (node != null) { if (L <= node.val && node.val <= R) ans += node.val; if (L < node.val) stack.push(node.left); if (node.val < R) stack.push(node.right); } } return ans; }