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);

输出结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值