資料結構很多演算法考察當中的樹就是基於一定結構下增刪改查或者搜尋遍歷的實踐。
針對這個問題:
什麼是二叉搜尋樹,引用百科的:
即是左邊節點的值總是小於右邊的值,當然也可以反過來。總之就是按一定的規則排序好的樹形結構。要將它改變成雙向鍊錶。樹的問題通常都可以通過遞迴去解決,這個問題一樣有遞迴的解決方案,我採用了另一種思路來解決。
因為題目的要求是不能申請額外的空間,就是不能new新的節點物件。
我首先獲取到所有節點的引用,這個可以採用任何你擅長的方式去遍歷整個樹。我採用的是我比較熟練的深度遍歷的方法去獲取整個樹的引用。方法如下:
// 存放引用的集合
list
alltreenodelist = new arraylist();
list
layernodelist = new arraylist();
layernodelist.add(treenode);
alltreenodelist.add(treenode);
while (layernodelist.size() != 0)
if (node.right != null)
}layernodelist = newlayernodelist;
}
因為題目要求的是雙向鍊錶按照一定的順序去排序,所以獲取到所有引用,最好給這個引用排序,然後存放在乙個有序的集合裡。可以選擇任何一種你擅長的排序方法去排序,我這裡採用氣泡排序,方法如下:
// 進行排序
for(int i = 0;i < alltreenodelist.size() - 1;i ++) }}
這樣我們就獲取到了所有節點引用的有序列表。將這個函式進行封裝。整個函式**如下:
// 排序好的節點引用
public
static listgettreenodelist(treenode treenode)
if (node.right != null)
}layernodelist = newlayernodelist;
}// 進行排序
for(int i = 0;i < alltreenodelist.size() - 1;i ++) }}
return alltreenodelist;
}
然後去遍歷這個集合列表,分別修改每個節點的引用指向,這樣就構建起來乙個雙向鍊錶。
public
static treenode convert(treenode prootoftree)
for(treenode node : alltreenodelist)
return alltreenodelist.get(0);
}
這裡就完成了整個搜尋二叉樹對於雙向鍊錶的轉換。 二叉搜尋樹與雙向鍊錶
1.問題描述 輸入一顆二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。來自 劍指offer 2.分析 對於二叉搜尋樹我們知道,樹的左孩子都比根節點要下,樹的右孩子都比根結點要大,根據這個特點,我們進行中序遍歷得到的序列就會滿足題目的要求,我們...
二叉搜尋樹與雙向鍊錶
問題描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。演算法 struct binarytreenode binarytreenode convert binarytreenode prootoftree plastnodeinl...
二叉搜尋樹與雙向鍊錶
排序二叉樹與雙向鍊錶.cpp 定義控制台應用程式的入口點。題目描述 輸入一棵二叉搜尋樹,將該二叉搜尋樹轉換成乙個排序的雙向鍊錶。要求不能建立任何新的結點,只能調整樹中結點指標的指向。思路 通過對一顆排序二叉樹的認識可知一顆排序二叉樹中序輸出就是有序的 通過後序遍歷讓子樹分別找到自己的left和rig...