108,109 有序陣列 鍊錶轉換二叉搜尋樹

2021-10-09 07:07:40 字數 1878 閱讀 5483

給定乙個單鏈表/陣列,其中的元素按公升序排序,將其轉換為高度平衡的二叉搜尋樹。

本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。

示例:給定的有序鍊錶: [-10, -3, 0, 5, 9],

乙個可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面這個高度平衡二叉搜尋樹:

0

/ \-3 9

/ /

-10 5

通過次數44,798提交次數59,804

思路:

1.陣列方式,也是108題,對於乙個有序陣列,構建完全平衡二叉樹關鍵在於遞迴的找到一段陣列的中點,作為當前的根節點,之後向下遞迴,當前的根節點的左子樹和右子樹分別在陣列中點的左邊和右邊,遞迴的求解即可;

2.對於有序鍊錶,無法在o(1)時間複雜度找到中點,因此考慮進行優化,可以從陣列方式中尋找突破口,可以知道,最後構建出來的樹的中序遍歷即是有序的鍊錶,那麼能否在構建的過程中,按照中序遍歷的順序進行重建呢?答案是可以的,相較於陣列方式,我們不一定需要在new出樹節點的時候馬上給他賦值,因為我們只能獲取當前構建的子樹的起點和終點,要獲取值需要進行鍊錶的遍歷,但是我們可以通過起點和終點判斷出當前是否是葉子節點,換句話說,我們可以虛擬出乙個包含n個節點的完全平衡二叉樹,對其進行中序遍歷並賦值,只不過遍歷的時候也要一遍建立節點。

3.需要注意,對於指標,也需要傳遞指標引用,否則指標按值傳遞的話,p = p->next不會被記錄。

/**

* definition for singly-linked list.

* struct listnode

* listnode(int x) : val(x), next(nullptr) {}

* listnode(int x, listnode *next) : val(x), next(next) {}

* };

*//**

* definition for a binary tree node.

* struct treenode

* treenode(int x) : val(x), left(nullptr), right(nullptr) {}

* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}

* };

*/class

solution

return

inorder

(head,

0,len-1)

;}treenode*

inorder

(listnode*

& head,

int left,

int right)

int mid =

(left+right)/2

; treenode* cur =

newtreenode()

; cur-

>left =

inorder

(head,left,mid-1)

; cur-

>val = head-

>val;

head = head-

>next;

cur-

>right =

inorder

(head,mid+

1,right)

;return cur;}}

;

有序陣列 有序鍊錶高效去重

基本原理 第一步 初始化兩個指標,乙個慢指標slow 乙個快指標fast。第二步 判斷慢指標slow和快指標fast的值是否一致,如不一致,慢指標slow加1 並把快指標fast的值賦值給慢指標slow,然後快指標fast加1。第三步 繼續掃瞄後面的元素,如果慢指標slow和快指標fast的值一致,...

利用有序陣列 鍊錶重構二叉搜尋平衡樹

因為二叉搜尋樹中序遍歷的結果就是乙個從小到大排列的陣列,因此陣列的中間位置的值,就是二叉搜尋樹的根節點的值 再依次採用遞迴,分別構建左右子樹。鍊錶和陣列的不同在於,陣列可以直接索引找到元素,查詢方便,鍊錶不能夠直接定位到某乙個元素 所以要採用鍊錶自己的方法,求中間位置 斷開鍊錶 進行迭代 鍊錶解法的...

LeetCode108 將有序陣列轉換為二叉搜尋樹

將乙個按照公升序排列的有序陣列,轉換為一棵高度平衡二叉搜尋樹。本題中,乙個高度平衡二叉樹是指乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1。示例 給定有序陣列 10,3,0,5,9 乙個可能的答案是 0,3,9,10,null,5 它可以表示下面這個高度平衡二叉搜尋樹 0 3 9 10...