劍指offer 二叉搜尋樹和雙向鍊錶

2022-08-10 06:39:12 字數 2197 閱讀 8223

題目描述

輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。

思路:在二叉樹中,每個結點都有兩個指向子結點的指標。在雙向鍊錶中,每個結點也有兩個指標,它們分別指向前乙個結點和後乙個結點。由於這兩種結點的結構相似,同時二叉搜尋樹也是一種排序的資料結構,因此在理論上有可能實現二叉搜尋樹和排序的雙向鍊錶的轉換。在搜尋二叉樹中,左子結點的值總是小於父結點的值,右子結點的值總是大於父結點的值。因此我們在轉換成排序雙向鍊錶時,原先指向左子結點的指標調整為鍊錶中指向前乙個結點的指標,原先指向右子結點的指標調整為鍊錶中指向後乙個結點指標。接下來我們考慮該如何轉換。

由於要求轉換之後的鍊錶是排好序的,我們可以中序遍歷樹中的每乙個結點, 這是因為中序遍歷演算法的特點是按照從小到大的順序遍歷二叉樹的每乙個結點。當遍歷到根結點的時候,我們把樹看成三部分:值為 10 的結點、根結點值為 6 的左子樹、根結點值為 14 的右子樹。根據排序鍊錶的定義,值為 10 的結點將和它的左子樹的最大乙個結點(即值為 8 的結點)鏈結起來,同時它還將和右子樹最小的結點(即值為 12 的結點)鏈結起來,如圖 4.13 所示。

按照中序遍歷的順序, 當我們遍歷轉換到根結點(值為 10 的結點)時,它的左子樹已經轉換成乙個排序的鍊錶了, 並且處在鍊錶中的最後乙個結點是當前值最大的結點。我們把值為 8 的結點和根結點鏈結起來,此時鍊錶中的最後乙個結點就是 10 了。接著我們去地歷轉換右子樹, 並把根結點和右子樹中最小的結點鏈結起來。至於怎麼去轉換它的左子樹和右子樹,由於遍歷和轉換過程是一樣的,我們很自然地想到可以用遞迴。

public

class

test

/*** 題目:輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。

* 要求不能建立任何新的結點,只能調整樹中結點指標的指向。**

@param

root 二叉樹的根結點

* @return

雙向鍊錶的頭結點

*/public

static

binarytreenode convert(binarytreenode root)

return

head;

}/*** 煉表表轉換操作**

@param

node 當前的根結點

* @param

lastnode 已經處理好的雙向鍊錶的尾結點,使用乙個長度為1的陣列,類似c++中的二級指標

*/public

static

void

convertnode(binarytreenode node, binarytreenode lastnode)

}public

static

void

main(string args)

private

static

void

printlist(binarytreenode head)

system.out.println("null");

}private

static

void

printtree(binarytreenode root)

}//10

/// \

//6 14

///\ /\

//4 8 12 16

private

static

void

test01()

//5///

//4///

//3///

//2///

//1private

static

void

test02()

//1//\

//2//\

//3//\

//4//\

//5private

static

void

test03()

//只有乙個結點

private

static

void

test04()

//沒有結點

private

static

void

test05()

}

劍指offer 二叉搜尋樹和雙向鍊錶

題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解答 利用二叉樹的中序遍歷,找到第乙個訪問的結點 利用標誌位first 用head記...

劍指offer 二叉搜尋樹與雙向連線

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。普通的二叉樹也可以轉換成雙向鍊錶,只不過不是排序的 思路 與中序遍歷相同 採用遞迴,先鏈結左指標,再鏈結右指標 1,更改doublelinkedlist,最後返回list的第乙...

《劍指offer》 二叉搜尋樹與雙向鍊錶

題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。解法 主要應用到二叉樹的中序遍歷。將左子樹遍歷進行不斷壓棧,然後再出棧。用兩個指標,current指向當前的樹的節點,pre指向前乙個節點,然後進行改指標引用,把壓棧的節點進行...