1. 程式人生 > >在二叉查詢樹中尋找兩個節點,使它們的和為一個給定值

在二叉查詢樹中尋找兩個節點,使它們的和為一個給定值

給定一個二叉搜尋樹和一個目標結果,如果 BST 中存在兩個元素且它們的和等於給定的目標結果,則返回 true。

使用中序遍歷得到有序陣列之後,再利用雙指標對陣列進行查詢。

應該注意到,這一題不能用分別在左右子樹兩部分來處理這種思想,因為兩個待求的節點可能分別在左右子樹中。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public boolean findTarget(TreeNode root, int k) {
       /*不能採用左右子節點分別迭代的演算法,因為目標值有可能分佈於左右子節點中
       應採用中序遍歷的方法,將結果值放在一個有序陣列中;然後採用雙指標思路;
       進行遍歷求和*/
        List<Integer> list=new ArrayList<>();
        inOrder(root,list);
        int i=0;
        int j=list.size()-1;
        while(i<j){
         int  target=list.get(i)+list.get(j);
            if(target==k){
                return true;
            }else if(target<k){
                i++;
            }else{
                j--;
            }
        }
        return false;       
    }
    public void inOrder(TreeNode root,List<Integer> list){
        if(root==null) return ;
        //先遍歷左子節點
        inOrder(root.left,list);
        //加入根節點
        list.add(root.val);
        //再加入右子節點
        inOrder(root.right,list);
    }
    
}