將二叉搜尋數轉化為排序的雙向鍊錶

2022-03-23 15:47:47 字數 1011 閱讀 3222

將乙個二叉搜尋樹就地轉化為乙個已排序的雙向迴圈鍊錶。可以將左右孩子指標作為雙向迴圈鍊錶的前驅和後繼指標。

為了讓您更好地理解問題,以下面的二叉搜尋樹為例:

我們希望將這個二叉搜尋樹轉化為雙向迴圈鍊錶。鍊錶中的每個節點都有乙個前驅和後繼指標。對於雙向迴圈鍊錶,第乙個節點的前驅是最後乙個節點,最後乙個節點的後繼是第乙個節點。

下圖展示了上面的二叉搜尋樹轉化成的鍊錶。「head」 表示指向鍊錶中有最小元素的節點。

特別地,我們希望可以就地完成轉換操作。當轉化完成以後,樹中節點的左指標需要指向前驅,樹中節點的右指標需要指向後繼。還需要返回鍊錶中的第乙個節點的指標。

下圖顯示了轉化後的二叉搜尋樹,實線表示後繼關係,虛線表示前驅關係。

解法1:

public

static

class

node

} public

node treetodoublylist(node root)

helper(root);

last.right =first;

first.left =last;

return

first;

} public

void

helper(node node)

else

last =node;

helper(node.right);

}}

private

node first;

private node last;

view code

將二叉搜尋樹轉化為雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。建立的雙向鍊錶的順序就是二叉搜尋樹的中序遍歷結果。這裡有遞迴和非遞迴解法。一般的非遞迴解法需要開闢額外的空間,本次借助morris演算法,給出一種不需要額外空間開銷的非遞迴解法。首先是遞...

二叉搜尋樹轉化為雙向鍊錶

首先需要明白二叉搜尋樹也是一種排序的資料結構,它的中序遍歷就是乙個不遞減的順序排列 所以如果要轉換成乙個排序好的雙向鍊錶,那麼僅需要改變原來指向左子節點和右子節點的指標,讓他們分別指向前節點和後節點即可,如圖所示 調整指標 原先指向左子節點的指標調整為鍊錶中指向前乙個節點的指標 原先指向右子節點的指...

二叉搜尋樹轉化為雙向鍊錶

整個過程可以看做是三部分的鍊錶化,左子樹 根節點和右子樹。遞迴地對這三部分進行鍊錶化,在鍊錶化中處理好左子樹最右節點與根節點的鏈結關係 根節點與右子樹的關係,那麼整個過程就能夠完成。treenode convert treenode root void convertnode treenode no...