JavaScript 二叉樹查找
二叉樹是一種有序樹,它的每一個節點至多有兩個子節點。二叉樹的搜索效率非常高,查找時間復雜度為O(logn)。在JavaScript中,可以使用對象來表示二叉樹,其左右孩子可以是另外兩個對象,也可以是null。下面我們通過代碼舉例來介紹如何使用JavaScript實現二叉樹查找。
//定義二叉樹節點類 class TreeNode { constructor(value) { this.value = value; this.left = null; this.right = null; } } //構建二叉樹 let root = new TreeNode(5); let node1 = new TreeNode(3); let node2 = new TreeNode(7); let node3 = new TreeNode(2); let node4 = new TreeNode(4); let node5 = new TreeNode(6); let node6 = new TreeNode(8); root.left = node1; root.right = node2; node1.left = node3; node1.right = node4; node2.left = node5; node2.right = node6; //二叉樹查找 function search(root, value) { if (root === null) { return false; } else if (root.value === value) { return true; } else if (value< root.value) { return search(root.left, value); } else { return search(root.right, value); } } console.log(search(root, 6)); //true console.log(search(root, 10)); //false
以上代碼中,我們定義了一個TreeNode類來描述二叉樹中的節點信息。在構建二叉樹時,我們先創建了根節點root,并分別創建了左右子節點。在構建節點之間的關系時,我們需要設置每個節點的左右孩子屬性。
為了查找二叉樹中的某個元素,我們需要遞歸地遍歷整棵樹。我們定義了search函數,該函數接收根節點和要查找的值兩個參數。首先判斷當前節點是否為null,如果是則返回false;如果當前節點的值等于要查找的值,則返回true;如果要查找的值小于當前節點的值,遞歸查找左子樹;否則遞歸查找右子樹。
下面再給一個二叉搜索樹的例子,用于說明如何使用方法來實現搜索。它的搜索方法比遞歸更加通用,同時也可以避免遞歸太深以至于棧溢出的情況。
//定義二叉樹節點類 class TreeNode { constructor(value) { this.value = value; this.left = null; this.right = null; } //向二叉樹中插入節點 insert(node) { if (node.value< this.value) { if (this.left === null) { this.left = node; } else { this.left.insert(node); } } else { if (this.right === null) { this.right = node; } else { this.right.insert(node); } } } //查找二叉樹中的值 search(value) { if (this.value === value) { return true; } else if (value< this.value && this.left !== null) { return this.left.search(value); } else if (value >this.value && this.right !== null) { return this.right.search(value); } return false; } } //構建二叉樹 let root = new TreeNode(5); root.insert(new TreeNode(3)); root.insert(new TreeNode(7)); root.insert(new TreeNode(2)); root.insert(new TreeNode(4)); root.insert(new TreeNode(6)); root.insert(new TreeNode(8)); console.log(root.search(6)); //true console.log(root.search(10)); //false
以上代碼中,我們在TreeNode類中定義了insert和search方法來實現節點的插入和查找。在插入過程中,我們依照當前節點值的大小關系來判斷插入節點應當位于左子樹還是右子樹。在查找時,同樣是遞歸地遍歷整棵樹,如果找到與要查找的值相同的節點,則返回true;如果要查找的值小于當前節點的值且左子樹不為空,則遞歸搜索左子樹;如果要查找的值大于當前節點的值且右子樹不為空,則遞歸搜索右子樹。
通過以上兩個例子,我們可以看到JavaScript非常適合用來實現二叉樹查找功能。無論是遞歸還是方法實現查找,都可以在O(logn)的時間復雜度內找到想要的結果。