劍指offer 二叉搜尋樹與雙向鍊錶

2021-08-06 04:45:20 字數 1324 閱讀 1486

此處感謝:

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

二叉搜尋樹的性質:左子樹小於根節點,右子樹大於根節點。所以,將二叉搜尋樹轉換成乙個排序的雙向列表,即從頭至尾的順序為:左子樹、根節點、右子樹。

但是要特別注意的是,在雙向鍊錶中,第乙個元素也是有指向前乙個元素的指標的,只不過是nullptr,所以在轉換時不要忘記該節點的指標。同樣最後乙個元素也有指向後節點的指標的,同樣是nullptr。

/*

struct treenode

};*/

class solution

treenode* prepoint = nullptr;

helpconvert(prootoftree,prepoint);

while(prootoftree->left!=nullptr)

return prootoftree;

}// 注意此處的prepoint的傳參方式

void helpconvert(treenode* prootoftree, treenode*& prepoint)

helpconvert(prootoftree->left,prepoint);

prootoftree->left = prepoint;

if(prepoint != nullptr)

prepoint = prootoftree;

helpconvert(prootoftree->right,prepoint);

}};

在此處應該尤其注意輔助函式helpconvert的傳參方式,prepoint引數傳遞時,使用的是引用傳遞的方式。原因如下:

1)指標雖然是位址傳遞,但實際上也是在函式中又定義了乙個新的指標讓其與傳入的指標指向同一位址。但兩個指標本身作為變數在記憶體中的存放位址是不同的,就是說這是兩個不同的變數,只是內容(即所指位址)相同。

2)在函式中對新定義的指標動態申請記憶體,但是當函式結束後,申請的記憶體的生命週期也就結束了,所以當回到主函式時,作為實參的指標位址和內容都沒有變化。仍然是個空指標,對其進行訪問自然出現了記憶體讀錯誤了。

假如在main函式中這樣寫:

int *a = (int*)malloc(sizeof(int)*3);

就不會出現記憶體讀錯誤了,但是輸出結果還是錯誤的,道理也是一樣的。

3)用引用作為實參傳入時,fun函式中的b其實就是主函式中a的別名(或者叫外號),反正就是操作完全相同,位址相同,內容相同的乙個變數,所以當fun函式返回時,對b的操作在主函式中對a同樣有效。

劍指offer 二叉搜尋樹與雙向連線

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。普通的二叉樹也可以轉換成雙向鍊錶,只不過不是排序的 思路 與中序遍歷相同 採用遞迴,先鏈結左指標,再鏈結右指標 1,更改doublelinkedlist,最後返回list的第乙...

《劍指offer》 二叉搜尋樹與雙向鍊錶

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解法 主要應用到二叉樹的中序遍歷。將左子樹遍歷進行不斷壓棧,然後再出棧。用兩個指標,current指向當前的樹的節點,pre指向前乙個節點,然後進行改指標引用,把壓棧的節點進行...

《劍指offer》二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向 輸入一棵二叉搜尋樹 將該二叉搜尋樹轉換成乙個排序的雙向鍊錶 struct treenode class solution 按照中序遍歷,按照左子樹 根節點 右子樹的順序。include ...