二叉搜尋樹中的搜尋

問題描述

二叉搜尋樹

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

示例 1:

二叉搜尋樹中的搜尋

輸入:root = [4,2,7,1,3], val = 2

輸出:[2,1,3]

示例 2:

二叉搜尋樹中的搜尋

輸入:root = [4,2,7,1,3], val = 5

輸出:[]

提示:

數中節點數在[1, 5000]範圍內

1 <= Node。val <= 10^7

root 是二叉搜尋樹

1 <= val <= 10^7

問題分析

這題說的是在

二叉搜尋樹

中的查詢,我們首先要搞懂什麼是二叉搜尋樹。維基百科上對二叉搜尋樹是這樣描述的:

二叉查詢樹(英語:Binary Search Tree),也稱為二叉查詢樹、有序二叉樹(ordered binary tree)或排序二叉樹(sorted binary tree),是指一棵空樹或者具有下列性質的二叉樹:

若任意節點的左子樹不空,則

左子樹上所有節點的值均小於它的根節點的值

若任意節點的右子樹不空,則

右子樹上所有節點的值均大於它的根節點的值

任意節點的左、右子樹也分別為二叉查詢樹

二叉查詢樹相比於其他資料結構的優勢在於查詢、插入的時間複雜度較低。為O(log n)。

一句話概括就是

二叉搜尋樹每個節點的值都比他的所有左子節點值大,並且比他的所有右子節點值小

所以這題查詢的時候從根節點開始,如果找到就返回,如果比根節點小就往左子節點查詢,否則就往右子節點查詢……

public TreeNode searchBST(TreeNode root, int val) { //如果節點為空就返回空,或者找到了要找的節點也直接返回 if (root == null || root。val == val) return root; //如果val比當前節點的值小就在當前節點的左子節點來找, //否則就在當前節點的右子節點來找 if (val < root。val) return searchBST(root。left, val); else return searchBST(root。right, val);}

程式碼比較簡單,我們還可以改為非遞迴的方式

public TreeNode searchBST(TreeNode root, int val) { //如果當前節點不為空,並且也不是我們要找的,就繼續查詢 while (root != null && root。val != val) root = val < root。val ? root。left : root。right; return root;}