36 二叉搜尋樹與雙向鍊錶

2021-09-25 15:48:18 字數 1056 閱讀 9878

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

解析:這道題一開始看答案都無法理解,後來終於弄懂了

就是將二叉樹的left和right轉化為鍊錶節點的左右指標,因為是按照從小到大順序所以就得是中序遍歷,得到每個節點,然後就是對節點進行指標運算

這三句是關鍵,而且前兩句順序不能變

//cur指向當前節點,pre指向前乙個節點

cur->left = pre;//將cur->left指向pre,就是向左的方向指標建立連線

if (pre)pre->right = cur;//將pre->right指向cur就是向右的方向指標建立連線

pre = cur;將後乙個節點給pre

為什麼pre要用引用或者二級指標?

明白這個首先要明白指標的位址和指標指向的位址,指標有自己的位址,而位址上存著值(一般我們改變以及指標指向就是將位址上的值存另乙個節點的位址,這樣不就是指向這個節點了嗎,但是自己指標的位址還是自己位址,只是指標位址上的值變了)(自己部落格指標那一欄有**文章講了),cur用一級指標就可以了,因為cur指標指向哥哥節點就可以了,然後對當前節點進行操作改變left和right值。但是pre必須要用二級指標或者引用,因為要儲存前乙個指標的位址,就相當於自己造了乙個位址,就是自己弄出來個節點,而pre要跟著cur指標向前走,所以必須是cur指標將位址給他。

為什麼cur不用二級指標?

因為cur指向當前節點,就能夠操作left和right指標,而pre指標一開始nullptr,他誰也不指向,然後cur給pre就改變了他的指向,那我有問了,那我第一次把pre給cur不就行了,然後指向pre->right不就行了,問題所在就是pre->right沒有,這是需要自己弄出來的,所以必須每次cur把位址給他

/*

struct treenode

};*/

class solution

return res;

}void converttreenode(treenode* cur, treenode*& pre)

};

36 二叉搜尋樹與雙向鍊錶

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的節點,只能調整樹中節點指標的指向。二叉樹節點的定義如下 public class treenode 很明顯該題考察的是樹的中序遍歷演算法,即用遞迴和非遞迴分別實現。如下 遞迴的中序遍歷演算法 treenode lastn...

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

題目描述輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的 結點,只能調整樹中結點指標的指向。思路 需要注意,last 在函式裡,用的是 指標的指標。如果不這樣做,會報錯 自己對指標這部分理解的也不是很深,這部分以後還要再好好看看 struct treenode cla...

二叉搜尋樹與雙向鍊錶

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