二叉查找树由节点和边组成。
我们可以定义一个Node类节点,它存储节点、左右子节点的数据,然后定义一个显示数据的方法:
//下面定义一个节点类函数节点(数据,左,右){//这个节点的键值。数据=数据;//左节点this.left=left//右节点this.right=left//显示该节点的键值。show=显示;}//实现show方法函数show(){ return this . data;}然后定义二进制查找树类BST,其中定义了树的根节点,初始化为null,然后定义了插入节点的方法和在一侧遍历的方法:
//二叉查找树BST//有节点属性,还有一些其他的方法。下面定义了一个二叉查找树BST类函数BST(){ //根节点初始化为null this.root=null//方法//insert this . insert=insert;//遍历this . in order=in order;//traverse this . preorder=preorder first;//traverse this . postsorder=postsorder;}//实现insert insertion方法函数insert(数据){ //创建节点保存数据var node=new Node(数据,null,null);//接下来,将节点节点插入到树中。//如果树为空,则将节点设置为根节点if(!this . root){ this . root=node;}else{ //树不是空的//判断是插在父节点的左边还是右边//所以先保存父节点//var parent=this . root;var current=this.rootvar父级;//如果要插入的节点的键值小于父节点的键值,则将其插入父节点的左侧。//如果父节点左侧为空,否则将父节点下移一级。//然后在(true){ //数据小于父节点parent=current的键值时进行判断;If(data parent.data){ //向左下移父节点(向左插入)//parent=parent . left;current=current.left//如果节点为空,插入if(!当前){ //!这里要特别注意,如果用这种方式给节点赋parent,只有parent指向node,//并且不添加到parent元素的左边!它甚至没有被添加到树上。因此,我们必须先记住父元素,然后将当前元素添加到parent.left=node打破;} }else{ //向右下移动父节点(向右插入)current=current.rightif(!当前){ parent.right=node打破;} } } } }//实现inorder遍历方法(左、中、右)函数inorder(node){ if(node){ inorder(node。左);console . log(node . show());inoder(node . right);} }//先遍历函数preorder(node){ if(node){ console . log(node . show());前序(节点.左侧);前序(节点.右);} }//遍历函数poster order(node){ if(node){ preorder(node。左);前序(节点.右);console . log(node . show());}}测试:
//遍历函数poster order(node){ if(node){ poster order(node。左);后置(node . right);console . log(node . show());} }//实例化一个BST树var tree=new BST();//添加节点tree . insert(30);树插入(14);树插入(35);树插入(12);树插入(17);//以中间顺序遍历tree . inoder(tree . root );//先遍历tree . preorder(tree . root);//依次遍历tree . post order(tree . root);结果:
顺序遍历:
顺序遍历:
序列后遍历:
以上就是本文的全部内容。希望对大家的学习有帮助,支持我们。