二叉搜尋樹的最小節點絕對值之差/在二叉查詢樹中尋找兩個節點,使它們的和為一個給定值/找出 BST 中的所有眾數(出現頻率最高的元素)。
阿新 • • 發佈:2018-12-06
關於二叉樹的數值運算,一般考慮借用中序遍歷為陣列;再進行計算的思想。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { /*定義兩個私有變數 最小的絕對值差 當前節點的前一個節點 */ private int minDiff=Integer.MAX_VALUE; private TreeNode preNode =null; public int getMinimumDifference(TreeNode root) { /*中序遍歷*/ inOrder(root); return minDiff; } public void inOrder(TreeNode node){ if(node==null) return ; //遍歷左節點 inOrder(node.left); //前節點不為空,找到最小絕對值差 if(preNode!=null) minDiff=Math.min(minDiff,node.val-preNode.val); //更新前節點 preNode=node; //中序遍歷右節點 inOrder(node.right); } }
使用中序遍歷得到有序陣列之後,再利用雙指標對陣列進行查詢。
應該注意到,這一題不能用分別在左右子樹兩部分來處理這種思想,因為兩個待求的節點可能分別在左右子樹中。
public boolean findTarget(TreeNode root, int k) { List<Integer> nums = new ArrayList<>(); inOrder(root, nums); int i = 0, j = nums.size() - 1; while (i < j) { int sum = nums.get(i) + nums.get(j); if (sum == k) return true; if (sum < k) i++; else j--; } return false; } private void inOrder(TreeNode root, List<Integer> nums) { if (root == null) return; inOrder(root.left, nums); nums.add(root.val); inOrder(root.right, nums); }
採用中序遍歷的思想;需要用到的變數太多。 還要注意資料轉換。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution { /*中序遍歷:定義一個儲存當前節點出現次數的常量curcount; 定義一個表示陣列中元素出現次數最多的常量maxcount 定義一個表示當前節點的前一個節點的樹元素preNode;方便與後一個元素比較 定義一個數組儲存出現次數最多(可以重複)的陣列 maxNumList */ private int curcount=1; private int maxcount=1; private TreeNode preNode=null; public int[] findMode(TreeNode root) { /*中序遍歷;儲存當前滿足條件的元素*/ List<Integer> maxNumList=new ArrayList<>(); inOrder(root,maxNumList); /*轉換資料結構*/ int index=0; int[] res=new int[maxNumList.size()]; for(int num:maxNumList){ res[index++]=num; } return res; } public void inOrder(TreeNode node,List<Integer> nums){ if(node==null) return; inOrder(node.left,nums); if(preNode!=null){ if(preNode.val==node.val){ curcount++; }else{ curcount=1; } } if(curcount>maxcount){ maxcount=curcount; nums.clear(); nums.add(node.val); }else if(curcount==maxcount){ nums.add(node.val); } preNode=node; inOrder(node.right,nums); } }