JSバイナリツリーアルゴリズム

       // 生成二叉树
        機能binarySearchTree(){ 
            ノードせ = 関数(キー){
                 この .KEY = キーと、
                この .LEFT = nullをこの .RIGHT = nullを
            } 
            ルートせ = ヌル// 插入一个节点
            この .insert = 関数(キー){ 
                    newNodeせ = 新しいノード(キー)。
                    ルート ==のヌル(ルート=newNode):(insertNode(根、newNode))
                } 
            // ソート昇順バイナリツリーアレイに配置順序で
            この .inOrderRraverse = 関数(コールバック){ 
                    inOrderRraverseNode(根、コールバック); 
                } 
            //は、最大値取得し
            、これを = .MAX 関数(){
                     戻りfindMaxNode(ルート); 
                } 
            // 最小値を取得し
            、この .min = 関数(){
                     戻りfindMinNode(ルート); 
                } 
            //は指定された値が存在するか否かを判断し
            、この .search = 関数(キー){
                     戻りsearchNode(ルート、キー)
                } 
            // 删除指定的值
            この .remove = 関数(キー){ 
                ルート = がremoveNode(ルート、キー)
            } 
        } 

        関数がremoveNode(ノード、キー){
             場合(ノード=== NULL){ // ノード等于ヌル
                リターン ヌル
            } 
            場合(キー> node.key){ // ノード在右子树 
                node.right = がremoveNode(node.right、キー)
                リターン・ノード;
            } そう であれば(キー<node.key){ // 左サブツリーにおけるノード 
                = node.left がremoveNode(node.left、Key)を、
                 返すノード; 
            }  { // ノード等しいnode.key 
                // 子ノード
                場合(node.left === ヌル && node.right === NULL ){ 
                    ノード = NULL ;
                     戻りノード
                } 
                // 唯一の子ノード
                IF(node.left === NULL ){ 
                    ノード= Node.right;
                     戻りノード; 
                } そう IF(node.right === NULL ){ 
                    ノード = node.left;
                     リターンノード
                } 
                // 2つのつの子ノード
                // ノードの右の部分木のノードを見つけるために最小としてキーは、対応する子ノードの右サブツリーを削除 
                LET AUX = ; findMinNode(node.right)
                node.key = AUXと、
                node.right = がremoveNodeを(node.right、aux.key);
                 戻りノード; 
            } 

        }

        関数searchNode(ノード、キー){
             場合(ノード!= NULL ){
                 場合(キー> node.key){
                     返す(node.right)searchNodeと、
                } 他の 場合(キー< node.key){
                     戻りsearchNode(node.left)を、
                } {
                     戻り 
                } 
            } {
                 戻り 
            } 
        } 

        関数findMaxNode(ノード){
             場合(ノード){
                 一方(ノード&& node.right){ 
                    ノード = node.right。
                } 
                戻りnode.key。
            } {
                 戻り ヌル
            } 
        } 

        関数findMinNode(ノード){
             場合(ノード){
                 一方(ノード&& node.left){ 
                    ノード = node.left。
                } 
                戻りnode.key。
            }他の{
                 返す はnullを
            } 

        } 

        関数insertNode(ノード、newNode){
             場合(> newNode.key node.key){ // 比父节点小、在左子树 
                node.left == NULL(node.left = newNode):(insertNode(node.left、newNode))
            } { 
                node.right == NULL(node.right = newNode):(insertNode(node.right、newNode))
            } 
        } 

        関数inOrderRraverseNode(ノード、コールバック){
             もしノード(=!NULL ){ 
                inOrderRraverseNode(node.left、コールバック)
                コールバック(node.key)。
                inOrderRraverseNode(node.right、コールバック)
            } 
        }

デモ:

聞かせてツリー= 新しいbinarySearchTree(); 
        せARR = [20、40、60、70、50、10、15、4、7 ]。
        arr.map(項目 => { 
            tree.insert(項目); 
        }); 
        console.log(木)。
        コールバックさせ = 関数(キー){ 
            にconsole.log(キー)。
        } 
        tree.inOrderRraverse(コールバック)。
        console.log( '最大++++>' + tree.max()); 
        console.log( '分++++>' + tree.min())。
        console.log( '++++検索>' + tree.search(5 )); 
        tree.remove(20 )。
        tree.inOrderRraverse(コールバック)。

結果:

 

 

 

 

 

リファレンスから:https://cloud.tencent.com/developer/article/1482473

 

おすすめ

転載: www.cnblogs.com/xiaofenguo/p/11724547.html