題目:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。比如輸入下圖中左邊的二叉搜尋樹,則輸出轉換之後的排序雙向鍊錶。二叉搜尋樹的節點定義如下,這裡使用c#語言描述:
public首先,我們知道:在二叉樹中,每個結點都有兩個指向子結點的指標。在雙向鍊錶中,每個結點也有兩個指標,它們分別指向前乙個結點和後乙個結點。class
binarytreenode
public binarytreenode leftchild
public binarytreenode rightchild
public binarytreenode(int
data)
public binarytreenode(int
data, binarytreenode left, binarytreenode right)
}
其次,由於要求轉換之後的鍊錶是排好序的,我們可以中序遍歷樹中的每乙個結點,這是因為中序遍歷演算法的特點是按照從小到大的順序遍歷二叉樹的每乙個結點。
最後,按照中序遍歷的順序,當我們遍歷轉換到根結點(值為10的結點)時,它的左子樹已經轉換成乙個排序的鍊錶了,並且處在鍊錶中的最後乙個結點是當前值最大的結點。我們把值為8的結點和根結點鏈結起來,此時鍊錶中的最後乙個結點就是10了。接著我們去遍歷轉換右子樹,並把根結點和右子樹中最小的結點鏈結起來。
很明顯,轉換它的左子樹和右子樹,由於遍歷和轉換過程是一樣的,很自然地想到可以用遞迴。
public(1)輔助方法的封裝binarytreenode convert(binarytreenode root)
return
headinlist;
}private
void convertnode(binarytreenode node, ref
binarytreenode lastnodeinlist)
binarytreenode currentnode =node;
//轉換左子樹
if (currentnode.leftchild != null
)
//與根節點的銜接
currentnode.leftchild =lastnodeinlist;
if (lastnodeinlist != null
)
lastnodeinlist =currentnode;
//轉換右子樹
if (currentnode.rightchild != null
)
}
privateview codevoid
setsubtreenode(binarytreenode root, binarytreenode lchild, binarytreenode rchild)
root.leftchild =lchild;
root.rightchild =rchild;
}private
bstconverter converter;
[testinitialize]
public
void
initialize()
[testcleanup]
public
void
cleanup()
(2)功能測試、特殊輸入測試
//(1)測試通過情況10
/// \
//6 14
///\ /\
//4 8 12 16
[testmethod]
public
void
converttest1()
//5///
//4///
//3///
//2///
//1[testmethod]
public
void
converttest2()
//1//\
//2//\
//3//\
//4//\
//5[testmethod]
public
void
converttest3()
//樹中只有1個結點
[testmethod]
public
void
converttest4()
//空指標
[testmethod]
public
void
converttest5()
(2)**覆蓋率
出處:
劍指offer面試題25
面試題25 二叉樹中和為某乙個值的路徑 二叉樹結點定義 struct binarytreenode 預備知識 vector中的push back是新增乙個元素 vector中的pop back是刪除乙個元素 二叉樹的操作 include stdafx.h include binarytree.h 建...
劍指Offer 面試題25 二叉搜尋樹與雙向鍊錶
題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 主要利用非遞迴的中序遍歷的方式,將二叉搜尋樹進行中序遍歷 那麼,此時,二叉搜尋樹就成為乙個排序後的節點了,再將它們鏈結起來即可。題目 非遞迴的中序遍歷 思路 利用棧的資料結構...
《劍指Offer》面試題 平衡二叉樹
題目 輸入乙個二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。思路 用後序遍歷實現 先遍歷節點的左右子樹,左右子樹都平衡才來判斷該節點是否平衡,如果左右子樹中有不平衡的,則直接返回false,避免了從上往下逐個節點地計算深度帶來...