輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。
解析:這道題一開始看答案都無法理解,後來終於弄懂了
就是將二叉樹的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.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...