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());

 

posted @ 2019-01-16 21:25  orxx  阅读(734)  评论(0编辑  收藏  举报