劍指offer之列印二叉搜尋樹中第k小的結點

2022-07-12 01:39:12 字數 1255 閱讀 1277

給定一棵二叉搜尋樹,請找出其中的第k小的結點。

一開始我沒有注意到二叉搜尋樹這個詞,我還是以為是乙個普通的二叉樹,所以我就按照我的想法,將二叉樹的節點放入到乙個陣列中。

由於一開始我沒有注意到二叉搜尋樹這個概念,所以的我的思路是按照普通二叉樹的查詢進行的,具體思路如下所示:

首先判斷當前節點是否為空,k是否小於0.如果為真,則返回的是null

新建乙個長度為k個陣列,這個陣列中將按照node的val進行排序,排序函式為movearr

movearr函式中定義了將節點按照直接插入排序的思想進行排序。

然後遞迴的將二叉樹的節點依次放入到陣列中,返回陣列中的最後乙個元素即為第k小的元素

當我完成我的演算法並且通過的時候,我再一次檢視題解時發現,我還是粗心了,並沒有發現題目中所給出的隱含的意思。二叉搜尋樹是乙個非常特別的二叉樹,當乙個節點的左子樹和右子樹都存在時,左子樹中的值都小於該節點,右子樹中的所有值都大於該節點。

二叉搜尋樹的中序遍歷就是乙個公升序排序的陣列,所以查詢第k小的節點,就查詢陣列中索引為k-1的節點即可。

但是中序遍歷是找到所有的節點,但是我們只需要找到第k小的節點即可,所以我們對演算法有了一些改進,使用非遞迴的中序遍歷,找到第k小的節點就跳出迴圈。

具體的思路:

首先判斷當前節點是否為空,k是否小於0.如果為真,則返回的是null

將新建乙個stack棧,用來存放中序遍歷過程中的節點。

將執行while迴圈直到節點為null與stack為空時才停止。

樹節點的函式:

public class treenode
treenode kthnode(treenode proot, int k)

// 遍歷將數節點加入到陣列中

public void addtreenode(treenode node, treenode arr)

// 陣列移位, 判斷陣列要比哪乙個小

public void movearr(treenode node, treenode arr)

arr[i] = node;

return;}}

}

treenode kthnode(treenode proot, int k)else

}return null;

}

劍指offer 二叉樹 二叉樹搜尋樹

package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...

劍指offer之之字形列印二叉樹

題目 請實現乙個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推。前面講述了分行分成列印二叉樹,這裡要之字形。例子 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15列印結果應該是 8 12...

劍指offer 從上往下列印二叉樹

定義乙個佇列,依次加入佇列頭的子節點,並將佇列頭出佇列,知道隊列為空 coding utf 8 class treenode def init self,x self.val x self.left none self.right none class solution 返回從上到下每個節點值列表,...