欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JS二叉樹的簡單實現(xiàn)方法示例

 更新時間:2017年04月05日 14:12:08   作者:閑書  
這篇文章主要介紹了JS二叉樹的簡單實現(xiàn)方法,結(jié)合具體實例形式分析了基于javascript定義二叉樹及二叉樹節(jié)點的遍歷、查找、添加、刪除及運算相關(guān)操作技巧,需要的朋友可以參考下

本文實例講述了JS二叉樹的簡單實現(xiàn)方法。分享給大家供大家參考,具體如下:

今天學(xué)習(xí)了一下 二叉樹的實現(xiàn),在此記錄一下

簡單的二叉樹實現(xiàn),并且實現(xiàn)升序和降序排序輸出

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;//后續(xù)遍歷
  this.getMin = getMin;//最大值
  this.getMax = getMax;//最小值
  this.find = find;//查找值
  this.remove = remove;//刪除節(jié)點
  this.count = count;//獲取節(jié)點數(shù)量
  function insert(data){
    //創(chuàng)建一個新的節(jié)點
    var newNode = new Node(data,null,null);
    //判斷是否存在根節(jié)點,沒有將新節(jié)點存入
    if(this.root == null){
      this.root = newNode;
    }else{
      //獲取根節(jié)點
      var current = this.root;
      var parent;
      while(true){
        //將當(dāng)前節(jié)點保存為父節(jié)點
        parent = current;
        //將小的數(shù)據(jù)放在左節(jié)點
        if(data < current.data){
          //獲取當(dāng)前節(jié)點的左節(jié)點
          //判斷當(dāng)前節(jié)點下的左節(jié)點是否有數(shù)據(jù)
          current = current.left;
          if(current == null){
            //如果沒有數(shù)據(jù)將新節(jié)點存入當(dāng)前節(jié)點下的左節(jié)點
            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){
      //如果沒有只節(jié)點
      if(node.left == null && node.right){
        return null;
      }
      //如果沒有左節(jié)點
      if(node.left == null){
        return node.right;
      }
      //如果沒有右節(jié)點
      if(node.right == null){
        return node.left;
      }
      //有兩節(jié)點
      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;
  }
}

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)學(xué)運算用法總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)

希望本文所述對大家JavaScript程序設(shè)計有所幫助。

相關(guān)文章

最新評論