使用javascript實現排序二叉樹(1)
排序二叉樹的定義: 二叉樹的基礎上,左節點比父節點要小,右節點比父節點要大的二叉樹,叫排序二叉樹。
下面直接進入到我們的javascript程式碼 定義 排序二叉樹的過程
/*
分析二叉樹的結構得出,二叉樹由節點構成,每個節點又有自己的左右子樹。
並且有一個根節點
*/
function BinaryTree(){
var root = null; //根節點預設為null
/*
1.節點型別的建構函式,預設左右子樹都為空
*/
function Node(key){
this.key = key;
this.left = null;
this.right = null;
}
/*
2.根據排序二叉樹的規律,我們定義一個插入節點的方法,去填充排序二叉樹。該方法是BinaryTree的一個方法,需要繫結在this上讓其他呼叫者能呼叫。而不是作為內部方法。
*/
this.insert = function(key){
var newNode = new Node(key);
if(root === null){
root = newNode;
}else{
insertNode(root,newNode)
}
}
var insertNode = function(node,newNode){
if(newNode.key < node.key){
if(node.left === null){
node.left = newNode;
}else{
insertNode(node.left,newNode)
}
}else{
if(newNode.key > node.key){
if(node.right === null){
node.right = newNode;
}else{
insertNode(node.right,newNode)
}
}
}
}
}
/*
測試:檢視是否報錯,具體的流程邏輯可以通過打斷點來判斷是否與自己設想的一樣。
8
7 9
3 12
2 4
6
5
*/
var nodes = [8,7,3,4,6,5,2,9,12]
var binaryTree = new BinaryTree();
nodes.forEach((item)=>{
binaryTree.insert(item)
})
通過斷點除錯,最後得到的一個二叉樹應該是這樣的。也是符合二叉排序樹的定義的。
重點
- 分析資料結構的一個規律,從而能夠定義出節點型別中有哪些屬性
- 方法不要都繫結在 this 上面,因為有些函式是不需要暴露出去的,而是內部使用的。
- 我覺得讓我收穫比較大的是這裡的 insert 這個函式中又呼叫一個 insertNode 的函式,因為事實上真正的插入節點是需要兩個引數的,一個父節點,一個要插入的節點。所以會需要遞迴呼叫,如果不依靠 insertNode 直接用 insert方法 去遞迴是沒法遞迴的。因為外部壓根獲取不到 root 。之前還想著 只用 一個方法就實現插入遞迴 ,但是確實不行。
下期內容
- 實現排序二叉樹的 中序 前序 後續 遍歷
- 實現二叉樹的節點查詢功能
- 實現排序二叉樹的 刪除節點功能
- 應用排序二叉樹實現一個小遊戲