二叉搜尋樹與雙向鍊錶

2021-09-11 17:04:30 字數 1560 閱讀 7165

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

public class treenode 

}

分析問題:

明白二叉搜尋樹也是一種排序的資料結構,它的中序遍歷就是乙個不遞減的順序排列

所以如果要轉換成乙個排序好的雙向鍊錶,那麼僅需要改變原來指向左子節點和右子節點的指標,讓他們分別指向前節點和後節點即可,如圖所示

方法一、

調整指標

原先指向左子節點的指標調整為鍊錶中指向前乙個節點的指標,原先指向右子節點的指標調整為鍊錶中指向後乙個節點的指標。

如何調整

考慮根節點和左右子樹的根本情況,因為如果用遞迴,這種根本情況考慮就可以去將同樣的方法用到左右子樹上

對於這種基本情況,可以分成三個部分來看,根節點10,左子樹,右子樹,需要做的就是將10與左子樹中的最大值連起來,然後把10與右子樹中的最小值連起來。

現在有個問題就是我們並不知道左子樹中的最大值和右子樹中的最小值,如果我們知道就好了。但是想到遞迴,遞迴到左子樹中,如果左子樹已轉換為雙向鍊錶,那麼雙向鍊錶的最後乙個節點就是我們想要的,而右子樹中的第乙個節點也是我們想要的 。

參考:比較麻煩,看了很久沒有明白

public class testnew 

public static treenode convert(treenode root)

public static void main(string args) }}

方法

二、用如下方法更加簡單一些

直接中序遍歷把遇到的節點都合併到鍊錶中   左、根 、右

public class solution 

convert(prootoftree.left); //左

//第一次執行時,它會使最左邊葉子節點為鍊錶第乙個節點

if(righthead == null)else

convert(prootoftree.right); //右

return lefthead;}}

if(righthead == null)//如圈圈3表示

通過以上**,形成了lefthead 指向頭節點4;  prootoftree指向次節點6,二者形成雙向,且最終righthead 指向6 

可以重新理解一下中序遍歷的思想。

二叉搜尋樹與雙向鍊錶

1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...

二叉搜尋樹與雙向鍊錶

問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...

二叉搜尋樹與雙向鍊錶

排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...