題目描述:輸入一課二叉搜尋樹,將該二叉樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。比如,輸入圖中的二叉搜尋樹,則輸出轉換之後的雙向鍊錶
從中我們可以發現雙向鍊錶中的結點順序和二叉搜尋樹的中序遍歷得到的序列順序是一樣的。
我們可以使用遞迴和非遞迴兩種方式實現這道題的求解
非遞迴方式:我們借助棧結構,同時我們需要記錄當前結點和前乙個結點,這樣我們就能將當前結點的左指標和前乙個結點的右指標指向前乙個結點和當前結點。
if(root ==
null)
return
null;
stack
stack
=new
stack
<>();
treenode curr = root;
treenode prev =
null; //用於儲存遍歷的前乙個結點
boolean isfirst =
true;
while(curr !=
null||!
stack
.isempty())
curr =
stack
.pop();
if(isfirst)else //*
curr = curr.right;
}return root;
其實上述**中,和之間的**去掉後就成了二叉樹的中序遍歷非遞迴實現!
遞迴實現:1.一直向左孩子遞迴,直到最左邊的葉結點
2.然後將最左邊的結點和lastnode結點的指標指向正確的位置
3.將目前的值賦給lastnode值
4.同樣的方式右孩子遞迴,連線右子樹
private treenode lastnode = null;
public treenode convert(treenode prootoftree)
private
void
convertnode(treenode root)
curr.left = lastnode;
if(lastnode != null)
lastnode = curr;
if(curr.right != null)
}
劍指offer 面試題27 二叉搜尋樹與雙向鍊錶
題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶,要求不能建立任何新節點,只能調整樹中結點指標的指向。最後輸出排序後雙向鍊錶。基本思想 二叉樹中每個節點都有兩個指向子節點的指標。在雙向鍊錶中,每個節點也有兩個指標,分別指向前乙個節點和後乙個節點。二叉搜尋樹中,左子節點的值總是小於父節...
劍指Offer 面試題27 二叉搜尋樹與雙向鍊錶
題面 劍指offer p151 牛客網 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。如 如果不考慮箭頭,可以看到4 6 8 10 12 14 16是樹的中序遍歷 因此可以借用中序遍歷的方法進行修改 struct treenode ...
劍指offer面試題27 二叉搜尋樹與雙向鍊錶
題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 二叉搜尋樹左小右大,中序遍歷。當前結點左結點連線左子樹最大值,左子樹最大值右結點連線當前節點,以當前結點為最大值,以右子樹和最大值遞迴。include using names...