js算法练习--二叉树

class Node {
            constructor(key) {
                this.key = key;
                this.left = null;
                this.right = null;
            }
        }

        class BstSearch {
            constructor() {
                this.root = null;

            }
            insert(key) {
                var newNode = new Node(key);
               const inserNode = (node, newNode) => {
                    if (newNode.key < node.key) {
                        if (node.left == null) {
                            node.left = newNode;
                        }
                        else {
                            inserNode(node.left, newNode);
                        }
                    }
                    else {
                        if (node.right == null) {
                            node.right = newNode;
                        }
                        else {
                            inserNode(node.right, newNode);
                        }
                    }
                };
                if (!this.root) {
                    this.root=newNode;
                }
                else{
                    inserNode(this.root,newNode); 
                }
            }
            //中序遍历,从做小到最大访问,左跟又
            inOrderTraverse(callback){
                const inOrderTraverseNOde=(node,callback)=>{
                    if(node!=null){
                        inOrderTraverseNOde(node.left,callback);
                        callback(node.key);
                        inOrderTraverseNOde(node.right,callback);
                    }
                };
                inOrderTraverseNOde(this.root,callback);
            }
            //先序遍历,跟左右
            preOrderTraverse(callback){
                const preOrderTraverseNode=(node,callback)=>{
                    if(node){
                        callback(node.key);
                        preOrderTraverseNode(node.left,callback);
                        preOrderTraverseNode(node.right,callback)
                    }
                };
                preOrderTraverseNode(this.root,callback);
            }
            //后序遍历,左右根
            postOrderTraverse(callback){
                const postOrderTraverseNode=(node,callback)=>{
                    if(node){
                        postOrderTraverseNode(node.left,callback);
                        postOrderTraverseNode(node.right,callback);
                        callback(node.key);
                    }
                };
                postOrderTraverseNode(this.root,callback);
            }
            //最小值
            min(node){
                
                const minNode=(node)=>{return node ?(node.left?minNode(node.left):node):null};
                return minNode(node||this.root);
            }
            //最大值
            max(node){
                const maxNode=(node)=>{return node?(node.right?maxNode(node.right):node):null};
                return maxNode(node||this.root);
            }
            //搜索特定值
            search(value){
                const searchNode=(node,value)=>{
                    
                    if(node){
                        if(node.key==value)
                            return node;
                        else if(node.key<value && node.right){
                            return searchNode(node.right,value);
                        }
                        else if(node.key>value && node.left){
                            return  searchNode(node.left,value);
                        }
                    }
                    else{
                        return null;
                    }
                   
                };
               return searchNode(this.root,value);
            }
            

            //删除
           //如果是页面节点,直接删除
           //如果非页面节点
           //           有right,那么将right的最小值替换该节点,删除最小节点
           //           没有right,那么找left的right的最小值替换该节点,删除最小节点
           Remove(value){
               const RemoveNode=(node,value)=>{
                   debugger;
                   if(!node)
                        return false;
                    if(node.key==value){
                        if(node.left===null && node.right===null){
                            let n=node;
                            node=null;
                            
                            return n;
                        }
                        else  if( node.right){
                            let n=this.min(node.right);
                            node.key=n.key;
                            return RemoveNode(node.right,n.key);
                        }
                        else if(node.left){
                            let n=this.min(node.left);
                            node.key=n.key;
                            return  RemoveNode(node.left,n.key);
                        }
                    }
                    else if(node.key<value && node.right){
                        return RemoveNode(node.right,value);
                    }
                    else if(node.key>value && node.left){
                        return  RemoveNode(node.left,value);
                    }
                    
               };
               return RemoveNode(this.root,value);
           }

        }

        var bst=new BstSearch();
        bst.insert(11);
        bst.insert(7);
        bst.insert(5);
        bst.insert(3);
        bst.insert(9);
        bst.insert(8);
        bst.insert(10);
        bst.insert(13);
        bst.insert(12);
        bst.insert(14);
        bst.insert(20);
        bst.insert(18);
        bst.insert(25);

 

转载于:https://www.cnblogs.com/shuajing/p/11319052.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值