將排序二叉樹轉化成雙向鍊錶,應該是一道很常見的面試題目,網上的實現比較多,有用遞迴也有用中序遍曆法的。看到一位外國友人的實現,還是比較清晰的,思路如下:
1,如果左子樹不為null,處理左子樹
1.a)遞迴轉化左子樹為雙向鍊錶;
1.b)找出根結點的前驅節點(是左子樹的最右的節點)
1.c)將上一步找出的節點和根結點連線起來
2,如果右子樹不為null,處理右子樹(和上面的很類似)
1.a)遞迴轉化右子樹為雙向鍊錶;
1.b)找出根結點的後繼節點(是右子樹的最左的節點)
1.c)將上一步找出的節點和根結點連線起來
3,找到最左邊的節點並返回
下面是**實現:
bintree2listutil函式返回的node* 是root節點,bintree2list函式返回的是頭節點
this is the core function to convert tree to list. this function follows
steps 1 and 2 of the above algorithm */
node* bintree2listutil(node* root)
// convert the right subtree and link to root
if
(root->right!=null)
return
root;
}
// the main function that first calls bintree2listutil(), then follows step 3
// of the above algorithm
node* bintree2list(node *root)
{
// base case
if
(root == null)
return
root;
// convert to dll using bintree2listutil()
root = bintree2listutil(root);
// bintree2listutil() returns root node of the converted
// dll. we need pointer to the leftmost node which is
// head of the constructed dll, so move to the leftmost node
while
(root->left != null)
root = root->left;
return
(root);
二叉搜尋樹轉化成雙向鍊錶
輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。其中乙個測試用例 按層序遍歷輸入 對應輸出應該為 from left to right are 4,6,8,10,12,14,16 from right to left are 16,1...
01二叉查詢樹轉化成雙向鍊錶
題目 輸入一棵二元查詢樹,將該二元查詢樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只調整指標的指向。思路 head指向雙向煉表頭,x指向雙向鍊錶尾,中序遍歷二叉樹,每當遍歷乙個到乙個節點時,將它鏈結到雙向鍊錶尾。include using namespace std define max ...
將二叉搜尋樹轉化成有序的雙向鍊錶
問題描述 輸入乙個二叉搜尋樹,將該二叉樹轉化成乙個排序的雙向鍊錶。要求不能建立任何新的節點,只能夠調整樹中節點指標的指向。二叉樹的節點定義如下 struct node 由於該樹是二叉排序樹,所以每個根節點的左指標指向的是其左子樹的最右下角的節點,右指標指向的應當是其右子樹的最左下的節點。基於以上結論...