最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

簡單的二叉樹實(shí)現(xiàn),并且實(shí)現(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é)點(diǎn)
  this.count = count;//獲取節(jié)點(diǎn)數(shù)量
  function insert(data){
    //創(chuàng)建一個新的節(jié)點(diǎn)
    var newNode = new Node(data,null,null);
    //判斷是否存在根節(jié)點(diǎn),沒有將新節(jié)點(diǎn)存入
    if(this.root == null){
      this.root = newNode;
    }else{
      //獲取根節(jié)點(diǎn)
      var current = this.root;
      var parent;
      while(true){
        //將當(dāng)前節(jié)點(diǎn)保存為父節(jié)點(diǎn)
        parent = current;
        //將小的數(shù)據(jù)放在左節(jié)點(diǎn)
        if(data < current.data){
          //獲取當(dāng)前節(jié)點(diǎn)的左節(jié)點(diǎn)
          //判斷當(dāng)前節(jié)點(diǎn)下的左節(jié)點(diǎn)是否有數(shù)據(jù)
          current = current.left;
          if(current == null){
            //如果沒有數(shù)據(jù)將新節(jié)點(diǎn)存入當(dāng)前節(jié)點(diǎn)下的左節(jié)點(diǎn)
            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é)點(diǎn)
      if(node.left == null && node.right){
        return null;
      }
      //如果沒有左節(jié)點(diǎn)
      if(node.left == null){
        return node.right;
      }
      //如果沒有右節(jié)點(diǎn)
      if(node.right == null){
        return node.left;
      }
      //有兩節(jié)點(diǎn)
      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é)運(yùn)算用法總結(jié)》、《JavaScript排序算法總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》、《JavaScript查找算法技巧總結(jié)》及《JavaScript錯誤與調(diào)試技巧總結(jié)

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

相關(guān)文章

最新評論

特克斯县| 乌鲁木齐市| 鄂托克旗| 澜沧| 大姚县| 称多县| 文成县| 柳河县| 涞水县| 林芝县| 祥云县| 揭东县| 个旧市| 肥城市| 安康市| 马龙县| 崇左市| 武汉市| 麟游县| 彭州市| 育儿| 博湖县| 湛江市| 柏乡县| 广饶县| 北辰区| 汤阴县| 安龙县| 仙居县| 新乡县| 喜德县| 阜平县| 黄山市| 章丘市| 曲松县| 旌德县| 张家口市| 沅江市| 拉萨市| 潼南县| 乡宁县|