將二叉搜尋樹轉換成雙向鍊錶即當前結點的左指標指向左子樹的最大結點,右指標指向右子樹的最小節點,如下圖所示:
因此,只需要使用中序遍歷的順序進行轉換(中序遍歷一棵二叉搜尋樹即是從小到大輸出),然後用乙個指標plastnode
指向已經轉換的鍊錶的最大結點(尾結點)即可,剛開始時這個指標為null
。由於使用遞迴,當遍歷到當前結點時,左子樹已經完成了轉換,因此,只需讓plastnode
的右指標指向當前結點,當前結點的左指標指向plastnode
,讓plastnode
指標指向當前結點,然後遞迴右子樹即可。
最後在主函式裡面需要查詢到鍊錶的頭結點然後返回頭結點。
那個plastnode
指標在整個過程中用來記錄當前已完成轉換的鍊錶的未結點,作用相當於乙個全域性變數,因此可以用全域性變數來做,或者也可以在主函式中建立這個plastnode
指標變數,然後將這個指標變數的指標傳入呼叫的函式進行修改。如果不用上面兩種方法的話,當前的plastnode
就只能不斷地傳入傳出,增加了很多開銷,這個在寫**的時候自然就能體會到。最好的辦法還是用全域性變數,減少引數傳遞開銷。
/*
struct treenode
};*/
class
solution
public
: treenode*
convert
(treenode* prootoftree)
};
/*
struct treenode
};*/
class
solution
public
: treenode*
convert
(treenode* prootoftree)
};
/*
struct treenode
};*/
class
solution
public
: treenode*
convert
(treenode* prootoftree)
};
劍指offer 26 二叉搜尋樹與雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 將二叉搜尋樹convert為雙向鍊錶,嘗試遞迴解決。遞迴關係 當訪問到節點root時,root left與轉換後的左子樹鍊錶完成互指,root right與轉換後的右子樹鍊錶完成互...
劍指offer 26二叉搜尋樹與雙向鍊錶
題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。分析 遞迴 struct treenode class solution if prootoftree left null prootoftree right null 1 將...
劍指offer26 二叉搜尋樹與雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解題思路 類似於遞迴的中序遍歷 1.將左子樹構造成雙鏈表,並返回煉表頭節點。2.定位至左子樹雙鏈表最後乙個節點。3.如果左子樹煉表不為空的話,將當前prootoftree追加到左子樹鍊錶...