LeetCode算法題-Search in a Binary Search Tree(Java實現)

這是悅樂書的第295次更新,第314篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第163題(順位題號是700)。給定一個二叉搜索樹(BST)的和正整數val。 你需要在BST中找到節點的值等於給定val的節點。返回以該節點爲根的子樹。如果此節點不存在,則應返回null。例如:

鑑於樹:

        4
       / \
      2   7
     / \
    1   3

以及搜索的價值val:2

你應該返回這個子樹:

      2     
     / \   
    1   3

在上面的示例中,如果我們要搜索值5,因爲沒有值爲5的節點,我們應該返回null。

注意:空樹由null表示,因此你可以將預期輸出(序列化樹格式)視爲[],而不是null。

本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。

02 第一種解法

直接使用遞歸。因爲題目給的二叉樹是BST,其中序遍歷的節點值是從小到大排列且有序的,因此,直接使用中序遍歷的順序,按照左子樹-->根-->右子樹的順序遍歷即可。

// 藉助中序遍歷,左根右的順序
public TreeNode searchBST(TreeNode root, int val) {
    // 先判空
    if (root == null) {
        return null;
    }
    // 如果val大於當前節點值,就往右子樹裏面找
    if (root.val < val) {
          return searchBST(root.right, val);
    }
    // 如果相等,返回當前以節點爲根節點的子樹
    if (root.val == val) {
        return root;
    }
    // 如果val小於當前節點值,就往左子樹裏面找
    if (root.val > val) {
          return searchBST(root.left, val);
    }
    return null;
}


03 第二種解法

也可以世界使用迭代的方式,藉助while循環來實現,循環內部的判斷邏輯和第一種解法類似,如果當前節點值大於val,就進入左子樹找;如果當前節點值小於val,就進入右子樹找;如果相等,直接返回以當前節點爲根節點的子樹。

public TreeNode searchBST(TreeNode root, int val) {
    while (root != null) {
        if (root.val > val) {
            root = root.left;
        } else if(root.val < val){
            root = root.right;
        } else {
            return root;
        }
    }
    return null;
}


04 第三種解法

我們也可以使用隊列來做。將所有節點值依次入隊列,在入隊列前先判斷節點值是否等於val,等於就直接返回當前節點所在子樹。

public TreeNode searchBST(TreeNode root, int val) {
    if (root == null || root.val == val) {
        return root;
    }
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        TreeNode temp = queue.poll();
        if (temp.val == val) {
            return temp;
        } 
        if (temp.left != null) {
            queue.offer(temp.left);
        }
        if (temp.right != null) {
            queue.offer(temp.right);
        }
    }
    return null;
}


05 第四種解法

我們也可以將第三種方法再優化,不必所有的節點都進隊列,根據節點值的大小,來判斷是進左子樹還是進右子樹,此解法與第二種解法類似,但是使用隊列會有點多餘,直接使用第二種解法會更好,第二種解法的空間複雜度更低。

public TreeNode searchBST(TreeNode root, int val) {
    if (root == null || root.val == val) {
        return root;
    }
    Queue<TreeNode> queue = new LinkedList<TreeNode>();
    queue.offer(root);
    while (!queue.isEmpty()) {
        TreeNode temp = queue.poll();
        if (temp != null && temp.val == val) {
            return temp;
        } else if (temp != null && temp.val > val) {
            queue.offer(temp.left);
        } else if (temp != null && temp.val < val) {
            queue.offer(temp.right);
        }
    }
    return null;
}


06 小結

算法專題目前已日更超過四個月,算法題文章163+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章