JS常用數據結構和算法--二叉查找樹(BST)

什麼是樹?樹是一種特殊的數據結構,是非線形的數據結構,樹是由一個或多個結點組成的 集合。每個樹都有一個特定結點 ,叫做根結點。當結點大於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);

輸出結果如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章