zoukankan      html  css  js  c++  java
  • (js描述的)数据结构[树结构1.2](12)

    1.先序遍历
    在这里插入图片描述
    2.中序遍历
    在这里插入图片描述
    3.后序遍历
    在这里插入图片描述
    4.递归调用栈详解:
    在这里插入图片描述
    详细见: https://zhuanlan.zhihu.com/p/24291978
    5.删除节点操作分析:
    在这里插入图片描述
    5.代码封装

     //封装二叉搜索树
            function BinarySearchTree() {
                //封装节点内部类
                function Node(key) {
                    this.key = key
                    this.left = null
                    this.right = null
                }
                //属性
                this.root = null
                //方法
                // 1. insert方法
                BinarySearchTree.prototype.insert = function(key) {
                    var newNode = new Node(key)
                    if (this.root == null) {
                        this.root = newNode
                    } else {
                        this.insertNode(this.root, newNode)
                    }
                }
                //封装一个递归方法
                BinarySearchTree.prototype.insertNode = function(node, newNode) {
                    if (newNode.key > node.key) {
                        if (node.left == null) {
                            node.left = newNode
                        } else {
                            this.insertNode(node.left, newNode)
                        }
                    } else {
                        if (node.right == null) {
                            node.right = newNode
                        } else {
                            this.insertNode(node.right, newNode)
                        }
                    }
                }
                
                // 遍历方式
                // 1. 先序遍历
                BinarySearchTree.prototype.preOrderTranversal = function(handle) { //handle 为传入的处理key的函数
                    this.preOrderTranversalNode(this.ropot, handle)
                }
                //定义一个遍历节点的方法
                BinarySearchTree.prototype.preOrderTranversalNode = function(node, handle) {
                    if (node !== null) {
                        handle(node.key)
                        // 先序遍历左节点
                        this.preOrderTranversalNode(node.left, handle)
                        //先序遍历右节点
                        this.preOrderTranversalNode(node.right, handle)
                    }
                }
                // 2.中序遍历
                BinarySearchTree.prototype.midOrderTranversal = function(handle) { //handle 为传入的处理key的函数
                    this.midOrderTranversalNode(this.ropot, handle)
                }
                //定义一个遍历节点的方法
                BinarySearchTree.prototype.midOrderTranversalNode = function(node, handle) {
                    if (node !== null) {
                        // 先序遍历左节点
                        this.midOrderTranversalNode(node.left, handle)
                        handle(node.key)
    
                        //先序遍历右节点
                        this.midOrderTranversalNode(node.right, handle)
                    }
                }
                // 3.后序遍历
                BinarySearchTree.prototype.postOrderTranversal = function(handle) { //handle 为传入的处理key的函数
                    this.postOrderTranversalNode(this.ropot, handle)
                }
                //定义一个遍历节点的方法
                BinarySearchTree.prototype.postOrderTranversalNode = function(node, handle) {
                    if (node !== null) {
                        // 先序遍历左节点
                        this.postOrderTranversalNode(node.left, handle)
    
                        //先序遍历右节点
                        this.postOrderTranversalNode(node.right, handle)
                        handle(node.key)
    
                    }
                }
                // 寻找最值
                // 最大值
                BinarySearchTree.prototype.max = function() {
                    var node = this.root
                    while (node.right !== null) {
                        node = node.right
                    }
                    return node.key
                }
                // 最小值
                BinarySearchTree.prototype.min = function() {
                    var node = this.root
                    while (node.left !== null) {
                        node = node.left
                    }
                    return node.key
                }
    
                //搜索特定key
                
                BinarySearchTree.prototype.search  = function(key) {
                    // 1.通过循环实现
                    var node =this.root
                    while (node !== null) {
                        if (node.key < key ) {
                            node = node.right
                        } else if(node.key > key) {
                            node = node.left
                        } else {
                            return true
                        }
                        return false
                    }
    
                    // 2.通过递归实现
                    this.searchNode(this.root)
                }
                //递归函数封装
                BinarySearchTree.prototype.searchNode = function(node, key) {
                    if (node == null) {
                        return false
                    }
                    if (node.key < key) {
                        this.searchNode(node.left)
                    } else if(node.key > key) {
                        this.searchNode(node.right)
                    } else {
                        return true
                    }
                }
                //删除操作
                BinarySearchTree.prototype.remove = function(key) {
                    var current = this.root
                    var parent = null
                    var isLeftChild = true
                    //寻找key对应的节点
                    while (current.key != key) {
                        parent = current
                        if (current.key < key) {
                            isLeftChild = true
                            current = current.right
                        } else {
                            isLeftChild = false
                            current = current.left
                        }
                        if (current == null) {
                            return false
                        }
                    }
                    //找到了key对应的节点
                    // 删除的节点是叶子节点
                    if(current.left == null && current.right == null) {
                        //是根节点
                        if(current == this.root) {this.root = null}
                        //
                        else { isLeftChild ? parent.left = null: parent.right =null}
                    }
                    //节点有一个子节点
                    else if (current.left == null || current.right == null) {
                        //当前删除的节点是父节点的左节点
                        if (current == this.root) { this.root = current.left || current.right}
                        else if (isLeftChild) {
                            parent.left = current.left || current.right
                        }
                        //当前删除的节点是父节点的右节点
                        else{
                            parent.right = current.right || current.left
                        }
                    }
                    //节点有两个子节点
                    else {
                        var successor = this.getSuccessor(current)
                        if (successor == this.root) {
                            this.root = successor
                        } else {
                            if (isLeftChild) {
                                parent.left = successor
                            } else {
                                parent.right = successor
                            }
                        }
                        successor.left = current.left
                    }
                }
                //寻找后继的方法
                BinarySearchTree.prototype.getSuccessor = function(delNode) {
                    var successor = delNode     //后继节点的父节点
                    var current = delNode.right //后继节点的子节点
                    var successorParent = delNode //后继节点
                    while (current != null) {
                        successorParent = successor
                        successor = current
                        current = current.left
                    }
                    if (successor != delNode.right) { //当后继节点的不是删除节点的右节点时
                        successorParent.left = successor.right //把后记节点的右节点让后继节点的父节点的left指向它
                        successor.right = delNode.right //、把后继节点的右节点接上删除节点的右节点
                    }
                    return successor
                }
            }
    

    删除操作总结:
    在这里插入图片描述

  • 相关阅读:
    预备作业02:体会做中学(Learning By Doing)
    寒假作业01
    20210418第 237 场周赛(一)
    机器学习第七堂课20210415
    云计算与信息安全第七节课20210413
    操作系统第七堂课2021年0412内存管理基础
    机器学习第六堂课20210408
    云计算与信息安全第六节课20210406
    机器学习第五节课20210401
    云计算与信息安全第五堂课20210330
  • 原文地址:https://www.cnblogs.com/jackson1/p/12682658.html
Copyright © 2011-2022 走看看