zoukankan      html  css  js  c++  java
  • JS-常用的数据结构之树、二叉树、平衡二叉树

    二叉树的实现代码

      1 // 二叉树构造
      2 function BinaryTree(){
      3     var Node=function(key){         //节点函数
      4         this.key=key;
      5         this.left=null;
      6         this.right=null;
      7     }
      8 
      9     var root = null;
     10     this.insert = function(key){
     11         var newNode = new Node(key);
     12         if(root == null){
     13             root = newNode;
     14         }else{
     15             insertNode(root, newNode);
     16         }
     17     }
     18 
     19     var insertNode = function(node, newNode){
     20         if(node.key > newNode.key){
     21             if(node.left == null){
     22                 node.left = newNode;
     23             }else{
     24                 insertNode(node.left, newNode);
     25             }
     26         }else{
     27             if(node.right == null){
     28                 node.right = newNode;
     29             }else{
     30                 insertNode(node.right, newNode);
     31             }
     32         }
     33     }
     34 
     35     var inOrderTraverseNode = function(node, callback){
     36         if(node != null){
     37             inOrderTraverseNode(node.left, callback);
     38             callback(node.key);
     39             inOrderTraverseNode(node.right, callback);
     40         }
     41     }
     42     // 中序遍历 
     43     this.inOrderTraverse = function(callback){
     44         inOrderTraverseNode(root, callback);
     45     }
     46 
     47     var proOrderTraverseNode=function(node,callback){
     48         if(node!=null){
     49             callback(node.key)
     50             proOrderTraverseNode(node.left,callback)
     51             proOrderTraverseNode(node.right,callback)
     52         }
     53     }
     54     //前序遍历  复制   效率高得多
     55     this.proOrderTraverse=function(callback){
     56         proOrderTraverseNode(root,callback);
     57     }
     58 
     59     var postOrderTraverseNode=function(node,callback){
     60         if(node!=null){
     61             postOrderTraverseNode(node.left,callback)
     62             postOrderTraverseNode(node.right,callback)
     63             callback(node.key)
     64         }
     65     }
     66     //后续遍历  文件系统遍历
     67     this.postOrderTraverse=function(callback){
     68         postOrderTraverseNode(root,callback);
     69     }
     70 
     71     // 查找
     72     // 查找最大值
     73     var maxNode=function(node){
     74         if(node){
     75             while(node&&node.right!=null){
     76                 node=node.right;
     77             }
     78             return node.key;
     79         }
     80     }
     81     this.max=function(){
     82         return maxNode(root);
     83     }
     84 
     85     // 查找最小值
     86     var minNode = function(node){
     87         if (node){
     88             while(node && node.left != null){
     89                 node = node.left;
     90             }
     91             return node.key;
     92         }
     93     }    
     94     this.min=function(){
     95         return minNode(root);
     96     }
     97 
     98     // 查找指定值
     99     var searchNode=function(node,key){
    100         if (node == null){
    101             return false;
    102         }
    103 
    104         if(node.key > key){
    105             searchNode(node.left, key);
    106         }else if (node.key < key){
    107             searchNode(node.right, key);
    108         }else{
    109             return true;
    110         }
    111     }
    112     this.search=function(key){
    113         return searchNode(root,key)
    114     }
    115 
    116    /**
    117     * 二叉树的删除
    118     * 二叉树删除分三种情况
    119     * 删除左叶子节点
    120     * 删除右叶子节点
    121     * 以及拥有左右两个节点的主节点删除
    122     * 拥有左右两个节点的主节点删除要考虑到数据的可排序行需要将删掉的节点重新赋值
    123     */
    124    var findMinNode=function(node){ //如果存在左右两个节点的话查找右节点的最小节点
    125         if(node){
    126             while(node&&node.left!=null){
    127                 node=node.left
    128             }
    129             return node;
    130         }
    131         return null
    132     }
    133 
    134    var removeNode=function(node,key){
    135        if (node == null){
    136             return null;
    137        }
    138 
    139        if(node.key > key){ // 递归查找左叶子节点,直接等于返回的null值
    140             node.left = removeNode(node.left, key);
    141             return node;
    142        }else if(node.key < key){
    143             node.right = removeNode(node.right, key);
    144             return node;
    145        }else{
    146             if(node.left==null&&node.right==null){// 当只有一个节点,而且被选中
    147                 node=null;
    148                 return node;
    149             }
    150             if(node.left==null){ //左节点为空
    151                 node=node.right;
    152                 return node;            
    153             }else if(node.right==null){//右节点为空
    154                 node=node.left;
    155                 return node;
    156             }
    157             
    158             // ?????
    159             var aux=findMinNode(node.right);//查找到右节点最小节点赋值
    160             node.key=aux.key;
    161             node.right=removeNode(node.right,aux.key);
    162             return node;
    163        }
    164    }
    165    this.remove=function(key){
    166         return removeNode(root,key)
    167     }
    168 }
    169 
    170 // test
    171 var nodes=[8,3,10,2,9,14,4,7,13];
    172 var binaryTree=new BinaryTree();
    173 nodes.forEach(function(key){
    174     binaryTree.insert(key);
    175 })
    176 var callback=function(key){
    177     document.write(key);
    178 }
    179 binaryTree.inOrderTraverse(callback);
    180 
    181 document.write("+++++++++" + binaryTree.max());
  • 相关阅读:
    MYSQL关于数据库的操作命令
    理解js中的原型和原型链
    float引起的高度塌陷问题
    使用webpack2.0 搭建前端项目
    jquery插件开发总结
    js中的OOP编程
    关于gulp的基本使用
    关于requireJs的学习总结
    vuex的学习总结
    事件中的target与currentTarget的区别
  • 原文地址:https://www.cnblogs.com/orxx/p/10279494.html
Copyright © 2011-2022 走看看