1. 程式人生 > 其它 >【LeetCode】700. 二叉搜尋樹中的搜尋

【LeetCode】700. 二叉搜尋樹中的搜尋

700. 二叉搜尋樹中的搜尋

知識點:二叉樹;遞迴

題目描述

給定二叉搜尋樹(BST)的根節點和一個值。 你需要在BST中找到節點值等於給定值的節點。 返回以該節點為根的子樹。 如果節點不存在,則返回 NULL。

示例
給定二叉搜尋樹:

        4
       / \
      2   7
     / \
    1   3

和值: 2

返回:
      2     
     / \   
    1   3
在上述示例中,如果要找的值是   
5,但因為沒有節點值為 5,我們應該返回 NULL。

解法一:遞迴

二叉搜尋樹

首先應該明白二叉搜尋樹的含義:任意一棵樹的節點都大於左子樹,並且小於右子樹;
尤其是二叉搜尋樹的根節點不僅大於左節點,是大於左子樹,也就是上左樹上的任意一個節點,右節點同理。並且樹中的任意一個節點都是二叉搜尋樹;
一個很重要的性質:二叉搜尋樹按中序遍歷完之後是一個遞增序列;

函式功能:找到和值相等的節點
1.終止條件:root==null,則返回null。
2.該做什麼:拿到值後判斷值是否和自己一樣,如果一樣就返回,如果不一樣,則分別看值和節點誰大然後分別去左樹和右樹上繼續找。
3.先判斷根節點才能知道往哪個樹上去,前序。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if(root == null) return null;
        if(root.val == val) return root;
        else if(root.val > val) return searchBST(root.left, val);
        else return searchBST(root.right, val);
    }
}

空間複雜度:O(N):堆疊的支出

解法二:迭代

直接根據值去左樹和右樹上去找,直到找到或者走到頭為止,可以減少空間複雜度。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public TreeNode searchBST(TreeNode root, int val) {
        if(root == null) return root;
        TreeNode cur = root;
        while(cur != null){
            if(cur.val == val) return cur;
            else if(cur.val > val) cur = cur.left;
            else cur = cur.right;
        }
        return null;
    }
}

體會

要熟練掌握二叉搜尋樹的遞迴,往往會用到當前值和給定元素的大小關係,因為二叉搜尋樹是有嚴格大小關係的,根據比較的結果去左樹或者右樹。
其次要掌握二叉搜尋樹的關鍵性質:其中序遍歷是遞增數列;

相關題目(二叉搜尋樹)

701. 二叉搜尋樹中的插入操作
98. 驗證二叉搜尋樹
235. 二叉搜尋樹的最近公共祖先
669. 修剪二叉搜尋樹