LeetCode938:二叉搜尋樹的範圍和
阿新 • • 發佈:2018-12-26
思路一:中序遍歷後遍歷求和
只要是關於二叉搜尋樹的問題,首先要想到二叉搜尋樹的特徵以及中序遍歷的特徵。此題中的L和R指的是中序遍歷排序後的前後兩個結點。因此,要求L和R之間所有結點的值的和,就可以先中序遍歷得到排序後的陣列,然後遍歷陣列求和即可。
public int rangeSumBST(TreeNode root, int L, int R) { ArrayList<Integer> list = new ArrayList<Integer>(); help(root,list); Object[] arr = list.toArray(); int res = 0; for(int i=0;i<arr.length;i++){ if((Integer)arr[i] >= L && (Integer)arr[i] <= R){ res += (Integer)arr[i]; } } return res; } public void help(TreeNode root,ArrayList<Integer> list){ if(root == null){ return; } help(root.left,list); list.add(root.val); help(root.right,list); }
思路二:遍歷二叉樹時同時求和
思路一做了一些無用功,就是先完全遍歷一遍整個二叉樹,然後再遍歷陣列。其實可以考慮在遍歷二叉樹的同時判斷結點的值是否在L和R之間,是的話就求和,超出範圍就結束遍歷。這樣就大大降低時間複雜度了。
public int rangeSumBST(TreeNode root, int L, int R) { if(root == null){ return 0; } if(root.val < L){ return rangeSumBST(root.right, L, R); } if(root.val > R){ return rangeSumBST(root.left, L, R); } int res = 0; if(root.val >= L && root.val <= R){ int left = rangeSumBST(root.left, L, R); res += root.val; int right= rangeSumBST(root.right, L, R); res += (left + right); } return res; }