樹
什麼是樹?樹是一種特殊的數據結構,是非線形的數據結構,樹是由一個或多個結點組成的 集合。每個樹都有一個特定結點 ,叫做根結點。當結點大於1時,其餘的結點組成的集合也是根節點的子樹。
二叉查找樹(BST)
我們這裏介紹的是一種特殊的樹--二叉查找樹,也叫做二叉排序樹,先介紹什麼是二叉樹,二叉樹的每個結點的子節點不超過2個,一個父節點的兩個子節點分別稱爲左節點和右節點。
二叉查找樹屬於二叉樹的一種,它有一個特點,相對較小的值保存在左節點,較大的值保存在右節點。這裏作者實現了二叉查找樹的新節點插入,數據結構,先序遍歷,中序遍歷,後序遍歷。
function BST() {
this.root = null //根結點
this.insertNode = insertNode;//二叉樹中加入新節點
this.middleOrder = middleOrder;//二叉樹的中序遍歷
this.preOrder = preOrder;//二叉樹的先序遍歷
}
//節點類
function Node(data,left,right) {
this.data = data;//節點元素
this.left = left;//指向左分支的指針或引用
this.right = right;//指向右分支的指針或引用
}
//二叉查找樹中加入新節點
function insertNode(data)
{
let node = new Node(data,null,null)
//判斷是否有根結點
if(this.root === null)
{
this.root = node;
}
else
{
//current代表當前訪問的節點,默認從根節點開始
let current = this.root;
//表示當前被訪問的節點的父節點
let parent;
while(1)
{
//從根節點開始
parent = current;
//如果新節點的元素值小於當前被訪問的節點的元素值
if(data < current.data)
{
//當前被訪問的節點等於自己的之前的左節點
current = current.left;
//如果當前被訪問的節點爲空,則新節點等於上一個被訪問節點的左節點
if(current === null)
{
parent.left = node;
break;
}
}
else
{
//同理相反
current = current.right;
if(current === null)
{
parent.right = node;
break;
}
}
}
}
}
//二叉查找樹的中序遍歷
function middleOrder(node)
{
//遞歸
if(!(node == null))
{
//中序遍歷先遍歷左子樹,其次根節點,最後右子樹
middleOrder(node.left);
console.log(node.data);
middleOrder(node.right);
}
}
//二叉查找樹的先序遍歷
function preOrder(node)
{
//遞歸
if(!(node == null))
{
//先序遍歷先遍歷根節點,其次左子樹,最後右子樹
console.log(node.data);
preOrder(node.left);
preOrder(node.right);
}
}
//二叉查找樹的後序遍歷
function postOrder(node)
{
//遞歸
if(!(node == null))
{
//後序遍歷先遍歷左子樹,其次右子樹,最後根節點
postOrder(node.left);
postOrder(node.right);
console.log(node.data);
}
}
var bst = new BST();
bst.insertNode(23);
bst.insertNode(11);
bst.insertNode(4);
bst.insertNode(55);
bst.insertNode(14);
bst.insertNode(12);
bst.insertNode(7);
bst.insertNode(87);
bst.insertNode(21);
bst.insertNode(71);
console.log("中序遍歷:")
middleOrder(bst.root);
console.log("先序遍歷:")
preOrder(bst.root);
console.log("後序遍歷:");
postOrder(bst.root);
輸出結果如下: