1. 程式人生 > >二叉搜尋樹的最小節點絕對值之差/在二叉查詢樹中尋找兩個節點,使它們的和為一個給定值/找出 BST 中的所有眾數(出現頻率最高的元素)。

二叉搜尋樹的最小節點絕對值之差/在二叉查詢樹中尋找兩個節點,使它們的和為一個給定值/找出 BST 中的所有眾數(出現頻率最高的元素)。

關於二叉樹的數值運算,一般考慮借用中序遍歷為陣列;再進行計算的思想。

/**
 * 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);
    }
    
}