面試題36 二叉搜尋樹與雙向鍊錶

2021-10-03 12:33:14 字數 1153 閱讀 5022

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

調整指標

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

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

如何調整

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

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

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

/*

struct treenode

};*/

class

solution

// 對bst中序遍歷,得到有序序列;調整序列元素的指標,將有序序列調整為雙向鍊錶

void

convertnode

(treenode* cur,treenode*

& plast)

};

明確convert函式的功能。輸入:輸入乙個二叉搜尋樹的根節點。

過程:將其轉化為乙個有序的雙向鍊錶。

輸出:返回該鍊錶的頭節點。

明確成員變數plast的功能。

plast用於記錄當前鍊錶的末尾節點。

明確遞迴過程。

遞迴的過程就相當於按照中序遍歷,將整個樹分解成了無數的小樹,然後將他們分別轉化成了一小段一小段的雙向鍊錶。再利用plast記錄總的鍊錶的末尾,然後將這些小段鍊錶乙個接乙個地加到末尾。

二叉樹的三種遍歷的實現(c++)

面試題36 二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。為了讓您更好地理解問題,以下面的二叉搜尋樹為例 我們希望將這個二叉搜尋樹轉化為雙向迴圈鍊錶。鍊錶中的每個節點都有乙個前驅和後繼指標。對於雙向迴圈鍊錶,第乙個節點的前驅是最後乙個節點,...

面試題36 二叉搜尋樹與雙向鍊錶(分治)(遞迴)

題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的迴圈雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。為了讓您更好地理解問題,以下面的二叉搜尋樹為例 我們希望將這個二叉搜尋樹轉化為雙向迴圈鍊錶。鍊錶中的每個節點都有乙個前驅和後繼指標。對於雙向迴圈鍊錶,第乙個節點的前驅是最後乙個...

面試題24 二叉搜尋樹與雙向鍊錶

分析 1.二叉樹中,每個結點都有兩個指向子結點的指標。2.在雙向鍊錶中,每個結點也有兩個指標,分別指向前乙個結點和後乙個結點 3.二叉搜尋樹中,左子結點的值總是小於父結點的值,右子結點的值總是大於父結點的值。4.將二叉搜尋樹轉換為雙向鍊錶時,原先指向左子結點的指標調整為鍊錶中指向前乙個結點的指標,原...