劍指Offer面試題 25 二叉搜尋樹與雙向鍊錶

2021-09-07 22:37:45 字數 2766 閱讀 9417

題目:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。比如輸入下圖中左邊的二叉搜尋樹,則輸出轉換之後的排序雙向鍊錶。

二叉搜尋樹的節點定義如下,這裡使用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

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

)

}

(1)輔助方法的封裝

private

void

setsubtreenode(binarytreenode root, binarytreenode lchild, binarytreenode rchild)

root.leftchild =lchild;

root.rightchild =rchild;

}private

bstconverter converter;

[testinitialize]

public

void

initialize()

[testcleanup]

public

void

cleanup()

view code

(2)功能測試、特殊輸入測試

//

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()

(1)測試通過情況

(2)**覆蓋率

出處:

劍指offer面試題25

面試題25 二叉樹中和為某乙個值的路徑 二叉樹結點定義 struct binarytreenode 預備知識 vector中的push back是新增乙個元素 vector中的pop back是刪除乙個元素 二叉樹的操作 include stdafx.h include binarytree.h 建...

劍指Offer 面試題25 二叉搜尋樹與雙向鍊錶

題目 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 主要利用非遞迴的中序遍歷的方式,將二叉搜尋樹進行中序遍歷 那麼,此時,二叉搜尋樹就成為乙個排序後的節點了,再將它們鏈結起來即可。題目 非遞迴的中序遍歷 思路 利用棧的資料結構...

《劍指Offer》面試題 平衡二叉樹

題目 輸入乙個二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。思路 用後序遍歷實現 先遍歷節點的左右子樹,左右子樹都平衡才來判斷該節點是否平衡,如果左右子樹中有不平衡的,則直接返回false,避免了從上往下逐個節點地計算深度帶來...