zoukankan      html  css  js  c++  java
  • 浅谈排序二叉树

    前言:

    大学时代,已过去一年多了,数据结构是我们最害怕的课,也是我最喜欢的课,曾经有个plan毕业了研究算法,但是世事难料,最后自己的人生轨迹偏向了游戏行业。

    最近不知道那根筋不对,就是想回首,再看看二叉树,以下是我的一些见解,欢迎大家指正!

    我们工作中,使用最多的就是排序二叉树(不一定是平衡二叉树哦)

    以下代码,包含了,二叉树的创建,前序遍历,中序遍历,后续遍历,查找最大值,查找最小值,查找特定值,删除特定值(子节点,只有右孩子的节点,只有左孩子的节点,拥有左右子树的节点)

      1 var binaryTree = function(){
      2 
      3     var createNode = function(key){
      4         this.key = key;
      5         this.left = null;
      6         this.right = null;
      7     }
      8 
      9 
     10     var insertNode = function(node, newNode){
     11         if(newNode.key < node.key){
     12             if(node.left === null){
     13                 node.left = newNode;
     14             }else{
     15                 insertNode(node.left, newNode);
     16             }
     17         }else{
     18             if(node.right === null){
     19                 node.right = newNode;
     20             }else{
     21                 insertNode(node.right, newNode);
     22             }
     23         }
     24     }
     25 
     26 
     27     var root = null;
     28     this.createTree = function(key){
     29         var newNode = new createNode(key);
     30         if(root === null){
     31             root = newNode;
     32         }else{
     33             insertNode(root, newNode);
     34         }
     35     }
     36 
     37 
     38 
     39 
     40     // 中序遍历: 输出升序的数组
     41     var inorderTraversalNode = function(node){
     42         if(node !== null){
     43             inorderTraversalNode(node.left);
     44             console.log(node.key);
     45             inorderTraversalNode(node.right);
     46         }
     47     }
     48 
     49 
     50     // 前序遍历:高效复制一个二叉树(On)
     51     var preTraversalNode = function(node){
     52         if(node !== null){
     53             console.log(node.key);
     54             preTraversalNode(node.left);
     55             preTraversalNode(node.right);
     56         }
     57     }
     58 
     59 
     60     // 后序遍历:文件系统的遍历
     61     var postTraversalNode = function(node){
     62         if(node !== null){
     63             preTraversalNode(node.left);
     64             preTraversalNode(node.right);
     65             console.log(node.key);
     66         }
     67     }
     68 
     69 
     70     // type 1:前序
     71     // type 2:中序
     72     // type 3:后序
     73     this.traversal = function(type){
     74         switch(type){    
     75             case 1:
     76                 preTraversalNode(root);
     77                 break;
     78             case 2:
     79                 inorderTraversalNode(root);
     80                 break;
     81             case 3:
     82                 postTraversalNode(root)
     83                 break;
     84         }
     85     }
     86 
     87 
     88     var minNode = function(node){
     89         if(node){
     90             if(node.left){
     91                 return minNode(node.left);
     92             }else{
     93                 return node.key;
     94             }
     95         }
     96         return null;
     97     }
     98     this.min = function(){
     99         return minNode(root);
    100     }
    101 
    102 
    103 
    104     var maxNode = function(node){
    105         if(node){
    106             if(node.right){
    107                 return maxNode(node.right)
    108             }else{
    109                 return node.key;
    110             }
    111             return null;
    112         }
    113     }
    114     this.max = function(){
    115         return maxNode(root);
    116     }    
    117 
    118 
    119     var searchNode = function(node, key){
    120         if(node){
    121             if(key < node.key){
    122                 return searchNode(node.left, key);
    123             }else if(key > node.key){
    124                 return searchNode(node.right, key);
    125             }else{
    126                 return true;
    127             }
    128         }
    129         return false;
    130     }
    131     this.search = function(key){
    132         return searchNode(root, key);
    133     }    
    134 
    135     var findMinNode = function(node){
    136         if(node){
    137             if(node.left){
    138                 return findMinNode(node.left);
    139             }else{
    140                 return node;
    141             }
    142         }
    143         return null;
    144     }
    145     var removeNode = function(node, key){
    146         if(node){
    147             if(key < node.key){
    148                 node.left = removeNode(node.left, key);
    149                 return node;
    150             }else if(key > node.key){
    151                 node.right = removeNode(node.right, key);
    152                 return node;
    153             }else{
    154                 if(node.left === null && node.right === null){
    155                     node = null;
    156                     return node;
    157                 }else if(node.left === null){
    158                     node = node.right;
    159                     return node;
    160                 }else if(node.right === null){
    161                     node = node.left;
    162                     return node;
    163                 }else{
    164                     var aux = findMinNode(node.right);
    165                     node.key = aux.key;
    166                     node.right = removeNode(node.right, aux.key);
    167                     return node;
    168                 }
    169             }
    170         }
    171     }
    172     this.remove = function(key){
    173         root = removeNode(root, key)
    174     }
    175 }
    176 
    177 
    178 var tree = new binaryTree();
    179 var arr = [4, 2, 12, 10, -7, 21, 3, 99, 76];
    180 for(var i = 0; i < arr.length; i ++){
    181     tree.createTree(arr[i]);
    182 }
    183 
    184 tree.traversal(2);
    185 console.log('The tree minNode key is ' + tree.min());
    186 console.log('The tree maxNode key is ' + tree.max());
    187 console.log(tree.search(12) ? 'The key is 12 is found' : 'The key is 12 is not found');
    188 console.log(tree.search(11) ? 'The key is 11 is found' : 'The key is 11 is not found');
  • 相关阅读:
    性能分析工具 — bootchart 工具使用(android 8.1)【转】
    Linux Namespace : 简介【转】
    bootargs常用属性项【转】
    Openwrt学习笔记(四)——系统开机启动【转】
    容器核心技术--Cgroup 与 Namespace【转】
    Linux C/C++适配malloc申请按页对齐的内存,方便使用mprotect【转】
    Java8 Map computeIfAbsent方法说明
    【JVM】调优笔记4---JAVA Thread Dump 分析综述[转]
    【mysql安装】3.win10 mysql5.7安装(zip免安装版本)
    【谷歌】【chrome】二.谷歌插件推荐安装
  • 原文地址:https://www.cnblogs.com/mikeCao/p/10303742.html
Copyright © 2011-2022 走看看