二叉搜尋樹(二叉排序樹)的第k小節點

2021-09-25 14:56:16 字數 1494 閱讀 5927

首先明確乙個概念,二叉搜尋樹/二叉排序樹的特點是:

那麼通過這一特點就有乙個性質:二叉排序樹/二叉搜尋樹 的中序遍歷結果是遞增序列

那麼最簡單的方法就是將樹遍歷一遍,然後存到陣列a中,返回a[k-1]即可。

這種方法的時間效率,空間效率都是o(n) (其中n表示樹中有多少個節點,且不考慮遞迴所帶來的空間消耗)

那麼我們可不可以考慮在遞迴的過程中儲存乙個計數器,當計數器值為k時,即為找到?

答案是可以的,我們要仔細思考清楚。

int index =0;

//計數器

treenode kthnode

(treenode root,

int k)

//中序遍歷尋找第k個

treenode node =

kthnode

(root.left,k);if

(node != null)

index ++;if

(index == k)

return

kthnode

(root.right,k)

;}

定義函式kthnode為treenode kthnode(treenode root, int k),表示以root為根的二叉搜尋樹中,查詢到第k小的節點,如果存在則返回此節點,不存在則返回null。

那麼我們的思路就是:

先找root左子樹,看是否存在第k小的節點,如果存在,那麼直接返回左子樹的第k小節點即可。否則進入第2步如果左子樹不存在第k小的節點,那麼我們就看root節點是否就是第k個節點,如果是,則返回。否則進入第3部直接求右子樹是否存在第k小的節點

那麼計數器怎麼計數的呢?這個是關鍵!!

我們可以先考慮少量資料的情況。對於只含有3個節點的樹,應該是每當遍歷乙個節點後,計數器就加1。如下圖所示:先序遍歷到2,進入步驟1,找左子樹,發現左子樹為空,直接返回null;那麼進入第2步,判斷當前節點是否是第k個節點,顯然當前節點是第乙個節點,所以在第1,2步驟之間我們需要將計數器+1,然後第2步判斷2是否為第k個節點,如此下去,如上面所列的**一樣。

1

↙ ↘

23

總結:主要是理解遞迴的流程,計數器到底該怎麼變化,在何時變化,以及遞迴的流程安排。

上面我們提到的是求第k小的節點,那麼當我們求第k大的節點時,該怎麼做呢?同樣,我們可以按找這樣的方式遍歷二叉搜尋樹:先遍歷又子樹,再遍歷當前節點,再遍歷左子樹;這樣得到的結果為乙個遞減的序列,那麼現在的問題就是找到這個序列的第k個元素,問題與上面一樣了,**實現只需稍作修改即可

二叉搜尋樹(二叉排序樹)

描述 判斷兩序列是否為同一二叉搜尋樹序列 題目類別 樹 難度 中級 執行時間限制 10sec 記憶體限制 128mbyte 階段 入職前練習 輸入 開始乙個數n,1 n 20 表示有n個需要判斷,n 0 的時候輸入結束。接下去一行是乙個序列,序列長度小於10,包含 0 9 的數字,沒有重複數字,根據...

二叉排序樹 二叉搜尋樹

bstree bst.h pragma once template 友元類宣告 class bstree 友元類宣告 templateclass bstnode 自定義的結點型別及特徵 bstnode type d,bstnode left null,bstnode right null 初始化 d...

二叉搜尋樹(二叉排序樹)

全部資料結構 演算法及應用課內模板 二叉搜尋樹 二叉排序樹 binary search tree bst 二叉搜尋樹很簡單,就是左子樹的所有結點的鍵值小於根結點,右子樹的所有結點的鍵值大於根結點 這樣就能使插入與搜尋達到log級別 非常簡單 稍微說一說刪除吧 刪除分兩類 合併刪除和複製刪除 1 合併...