最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 二叉搜索树的实现,反转,前序,中序,后序,层序的遍历 --自我记录

    正文概述 掘金(行动派_)   2020-12-15   405

    //二叉树一般会有一个节点的node类还有tree树类,树里面会有根节点root
    class Node {
    constructor(element, parent) {
    this.element = element
    this.parent = parent
    this.left = null
    this.right = null
    }
    }

    // 树类
    class Tree {

    constructor() {
        this.root = null //树类默认为nul
    }
    
    add(element) { //增加树杈的方法
        //第一步逻辑考虑首次添加判断root为null
        if (this.root === null) {
            this.root = new Node(element, null)
            return
        }
        //如果非首次添加节点,那就需要去除根节点一层一层的取值去比较,看是放在左边还是右边
        let root = this.root
        let parent
        let compare
        while (root) { //有多个深层次节点的话循环不停的去取
            parent = root
            compare = root.element > element //root一旦为null就说明已经循环到底了
            if (compare) { //如果跟节点比传入的大放左边反之右边,考虑深度的情况下继续去取左边的left
                root = root.left
            } else {
                root = root.right
            }
        }
    
        if (compare) {
            parent.left = new Node(element, parent)
        } else {
            parent.right = new Node(element, parent)
        }
    }
    
    //前序遍历,先遍历根节点然后遍历左边再遍历右边
    preorder() {
        function a(node) {
            if (node === null) return
            console.log(node); //通过打印的顺序来模拟
            a(node.left)
            a(node.right)
        }
        a(this.root)
    
    }
    
    
    //中序遍历,先遍历左边然后中间,最后右边
    middle() {
        function a(node) {
            if (node === null) return
            a(node.left)
            console.log(node); //通过打印的顺序来模拟
            a(node.right)
        }
        a(this.root)
    
    }
    
    
    //后序遍历,是先遍历左子树,然后是右子树,最后才是中间的根节点
    epilogue() {
        function a(node) {
            if (node === null) return
            a(node.left)
            a(node.right)
            console.log(node); //通过打印的顺序来模拟
        }
        a(this.root)
    
    }
    
    //层序遍历 一层一层去 遍历 层序遍历利用栈去完成,取出一个个放进去,然后
    sequence() {
        let stack = [] //栈数组去存放
    
        stack.push(this.root) //先放入根元素
        while (stack.length) {
            let ele = stack.shift() //首先是取出根元素
            console.log(ele);
            if (ele.left) {
                stack.push(ele.left)
            }
    
            if (ele.right) {
                stack.push(ele.right)
            }
    
    
        }
    
    }
    
    //树的反转是利用层序的时候去互换,类似于冒泡排序
    reserve() {
        let stack = [] //栈数组去存放
    
        stack.push(this.root) //先放入根元素
        while (stack.length) {
            let ele = stack.shift() //首先是取出根元素
    
            //取出这个元素后就看看他的左右有没有有的话就互相
            let temp = ele.left
            ele.left = ele.right
            ele.right = temp
            console.log(ele);
            if (ele.left) {
                stack.push(ele.left)
            }
    
            if (ele.right) {
                stack.push(ele.right)
            }
    
    
        }
    
    }
    

    }

    let tree = new Tree()
    tree.add(10)
    tree.add(8)
    tree.add(6)
    tree.add(19)
    tree.add(15)
    tree.add(22)
    tree.add(20)

    // tree.preorder() 前序
    // tree.middle() 中序
    // tree.epilogue() //后序
    // tree.sequence() //层序
    tree.reserve()//反转
    // console.dir(tree, {
    // depth: 100
    // });


    起源地下载网 » 二叉搜索树的实现,反转,前序,中序,后序,层序的遍历 --自我记录

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元