面試題36:二叉搜尋樹與雙向鍊錶。輸入一棵二叉搜尋樹,將該二叉樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新節點,只能調整樹中節點指標的指向。
二叉樹中,每個節點都有兩個指向子節點的指標,雙向鍊錶中,每個節點也有兩個指標,分別指向前乙個節點和後乙個節點。在二叉搜尋樹中,所有左子節點的值總是小於父節點的值,所有右子節點的值總是大於父節點的值,且左右子樹都是一棵二叉搜尋樹,因此,我們在將二叉搜尋樹轉換成排序雙向鍊錶時,原先指向左(右)節點的指標調整為鍊錶中指向前(後)乙個節點的指標。
由於要求轉換後的鍊錶是排好序的,我們可以中序遍歷樹中每個節點,中序遍歷演算法可以按節點元素值從小到大的順序遍歷二叉搜尋樹。當遍歷到根節點時,根節點應該和左子樹的最大節點相連,並且和右子樹的最小節點相連。當我們遍歷到根節點時,它的左子樹已經轉換為乙個排序的鍊錶了,並且處在左子樹的排序鍊錶的最後乙個節點是左子樹中值最大的節點,右子樹同理,右子樹最小節點是排序鍊錶的首節點,以下**中以下圖樹為例:
// 左子樹長度
int* leftpreorderend = startpreorder + leftlength;
// 左子樹尾邊界
if(leftlength >0)
if(leftlength < endpreorder - startpreorder)
return root;
}binarytreenode*
construct
(int
* preorder,
int* inorder,
int length)
return
constructcore
(preorder, preorder + length -
1, inorder, inorder + length -1)
;}void
convertnode
(binarytreenode* pnode, binarytreenode*
* plastnodeinlist)
if(pnode-
>m_pleft !=
nullptr
) pnode-
>m_pleft =
*plastnodeinlist;
// 將中序遍歷中當前節點與上一節點相連if(
*plastnodeinlist !=
nullptr
)*plastnodeinlist = pnode;
// 更新中序遍歷到的節點
if(pnode-
>m_pright !=
nullptr)}
binarytreenode*
convert
(binarytreenode* proot)
intmain()
;int inorder=
; binarytreenode *proot =
construct
(preorder, inorder,7)
; binarytreenode *plastnodeinlist =
convert
(proot)
;printfrombigtosmall
(plastnodeinlist)
;while
(plastnodeinlist-
>m_pleft !=
nullptr
) cout <<
"另乙個方向列印雙向鍊錶:"
<< endl;
printfromsmalltobig
(plastnodeinlist)
;}
劍指offer 學習筆記 二叉搜尋樹的後序遍歷序列
面試題33 二叉搜尋樹的後序遍歷序列。輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷結果 只要存在乙個二叉搜尋樹的後序遍歷結果為它即可 如果是返回true,不是返回false。假設輸入陣列的任意兩個數字都不相同。後序遍歷得到的序列中,最後乙個數字是樹的根節點的值。陣列中前面的數字可分為兩部...
劍指offer 二叉樹 二叉樹搜尋樹
package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...
劍指Offer 二叉搜尋樹的後序遍歷
輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出yes,否則輸出no。假設輸入的陣列的任意兩個數字都互不相同。author zy date 2017年10月13日 下午9 34 21 decription 輸入乙個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如...