树
什么是树?树是一种特殊的数据结构,是非线形的数据结构,树是由一个或多个结点组成的 集合。每个树都有一个特定结点 ,叫做根结点。当结点大于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);
输出结果如下: