欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS二叉树的简单实现方法示例

程序员文章站 2022-06-11 19:22:36
本文实例讲述了js二叉树的简单实现方法。分享给大家供大家参考,具体如下: 今天学习了一下 二叉树的实现,在此记录一下 简单的二叉树实现,并且实现升序和降序排序输出...

本文实例讲述了js二叉树的简单实现方法。分享给大家供大家参考,具体如下:

今天学习了一下 二叉树的实现,在此记录一下

简单的二叉树实现,并且实现升序和降序排序输出

function node(data , left,right){
  this.data = data;
  this.left = left;
  this.right = right;
  this.show = show;
  function show(){
    return this.data;
  }
};
function bst(){
  this.root = null;
  this.insert = insert;//插入
  this.inorder = inorder;//中序遍历(升序)
  this.inorderdesc = inorderdesc;//中序遍历(降序)
  this.preorder = preorder;//先序遍历
  this.postorder = postorder;//后续遍历
  this.getmin = getmin;//最大值
  this.getmax = getmax;//最小值
  this.find = find;//查找值
  this.remove = remove;//删除节点
  this.count = count;//获取节点数量
  function insert(data){
    //创建一个新的节点
    var newnode = new node(data,null,null);
    //判断是否存在根节点,没有将新节点存入
    if(this.root == null){
      this.root = newnode;
    }else{
      //获取根节点
      var current = this.root;
      var parent;
      while(true){
        //将当前节点保存为父节点
        parent = current;
        //将小的数据放在左节点
        if(data < current.data){
          //获取当前节点的左节点
          //判断当前节点下的左节点是否有数据
          current = current.left;
          if(current == null){
            //如果没有数据将新节点存入当前节点下的左节点
            parent.left = newnode;
            break;
          }
        }else{
          current = current.right;
          if(current == null){
            parent.right = newnode;
            break;
          }
        }
      }
    }
  }
  function inorder(node){
    var data = [];
    _inorder(node,data);
    return data;
  }
  function inorderdesc(node){
    var data = [];
    _inorderdesc(node,data);
    return data;
  }
  function preorder(node){
    var data = [];
    _preorder(node,data);
    return data;
  }
  function postorder(node){
    var data = [];
    _postorder(node,data);
    return data;
  }
  function _inorder(node,data){
    if(!(node == null)){
      _inorder(node.left,data);
      data.push(node.show());
      _inorder(node.right,data);
    }
  }
  function _inorderdesc(node,data){
    debugger;
    if(!(node == null)){
      _inorderdesc(node.right,data);
      data.push(node.show());
      _inorderdesc(node.left,data);
    }
  }
  function _preorder(node,data){
    if(!(node == null)){
      data.push(node.show());
      _preorder(node.left,data);
      _preorder(node.right,data);
    }
  }
  function _postorder(node,data){
    if(!(node == null)){
      _postorder(node.left,data);
      _postorder(node.right,data);
      data.push(node.show());
    }
  }
  function getmin(){
    var current = this.root;
    while(!(current.left == null)){
    current = current.left;
    }
    return current.data;
  }
  function getmax(){
    var current = this.root;
    while(!(current.right == null)){
    current = current.right;
    }
    return current.data;
  }
  function find(data){
    var current = this.root;
    while(current != null){
      if(data == current.data){
        return current;
      }else if(data < current.data){
        current = current.left;
      }else{
        current = current.right;
      }
    }
    return null;
  }
  function getsmallest(node){
    var current = node;
    while(!(current.left == null)){
      current = current.left;
    }
    return current;
  }
  function remove(data){
    root = removenode(this.root,data);
  }
  function removenode(node,data){
    if(node == null){
      return null;
    }
    if(data == node.data){
      //如果没有只节点
      if(node.left == null && node.right){
        return null;
      }
      //如果没有左节点
      if(node.left == null){
        return node.right;
      }
      //如果没有右节点
      if(node.right == null){
        return node.left;
      }
      //有两节点
      var tempnode = getsmallest(node.right);
      node.data = tempnode.data;
      node.right = removenode(node.right,tempnode.data);
      return node;
    }else if(data < node.data){
      node.left = removenode(node.left,data);
      return node;
    }else{
      node.right = removenode(node.right,data);
      return node;
    }
  }
  function count(){
    var counts = 0;
    var current = this.root;
    if(current == null){
      return counts;
    }
    return _count(current,counts);
  }
  function _count(node,counts){
    debugger;
    if(!(node == null)){
      counts ++;
      counts = _count(node.left,counts);;
      counts = _count(node.right,counts);
    }
    return counts;
  }
}

更多关于javascript相关内容感兴趣的读者可查看本站专题:《javascript数据结构与算法技巧总结》、《javascript数学运算用法总结》、《javascript排序算法总结》、《javascript遍历算法与技巧总结》、《javascript查找算法技巧总结》及《javascript错误与调试技巧总结

希望本文所述对大家javascript程序设计有所帮助。