zoukankan      html  css  js  c++  java
  • 二叉树的前序,中序,后序,层序实现

    // 树根
    function Tree(data,left,right) {
        this.data = data
        this.left = left
        this.right = right
        this.leftNode = Tree.leftNode
        this.rightNode = Tree.rightNode
        this.PreOrderTraversal = Tree.PreOrderTraversal
        this.MidOrderTraversal = Tree.MidOrderTraversal
        this.AfterOrderTraversal = Tree.AfterOrderTraversal
        this.InorderTraversal = Tree.InorderTraversal // 采用堆栈实现中序
        this.orderTraversal = Tree.orderTraversal;
    }
    // 左节点
    Tree.leftNode = function(leftNode) {
        this.left = leftNode;
        return this;
    }
    // 右节点
    Tree.rightNode = function(rightNode) {
        this.right = rightNode;
    }
    // 前序遍历
    Tree.PreOrderTraversal = function(tree) {
        if(tree) {
            console.log(tree.data);
            this.PreOrderTraversal(tree.left);
            this.PreOrderTraversal(tree.right);
        }
    }
    // 中序遍历
    Tree.MidOrderTraversal = function(tree) {
        if(tree) {
            this.MidOrderTraversal(tree.left);
            console.log(tree.data);
            this.MidOrderTraversal(tree.right);
        }
    }
    // 后序遍历
    Tree.AfterOrderTraversal = function(tree) {
        if(tree) {
            this.AfterOrderTraversal(tree.left);
            this.AfterOrderTraversal(tree.right);
            console.log(tree.data);
        }
    }
    
    // 堆栈 非递归处理
    Tree.InorderTraversal = function(tree) {
        let stack = [];
        while(tree || stack.length > 0) {
            while(tree) {
                console.log(tree.data);
                stack.push(tree);
                tree = tree.left;
            }
            if(stack.length > 0) {
                tree = stack.pop();
                // console.log(tree.data);
                tree = tree.right;
            }
        }
    }
    
    // 层序遍历输出
    Tree.orderTraversal = function(tree) {
        let queue = [];
        if(!tree) return;
        queue.push(tree);
        while(queue.length > 0) {
            let tree = queue.shift()
            console.log(tree.data);
            if(tree.left) { queue.push(tree.left) }
            if(tree.right) { queue.push(tree.right) }
        }
    }
    
    
    
    let parent = new Tree('A');
    let b = new Tree('B');
    let c = new Tree('C');
    let d = new Tree('D');
    let e = new Tree('E');
    let f = new Tree('F');
    let g = new Tree('G');
    
    parent.leftNode(b).rightNode(c);
    b.leftNode(d).rightNode(e)
    c.leftNode(f).rightNode(g)
    
    console.log('先序遍历 == ');
    parent.PreOrderTraversal(parent);
    console.log('中序遍历 ==')
    // parent.MidOrderTraversal(parent);
    parent.InorderTraversal(parent);
    console.log('后序遍历 ==')
    parent.AfterOrderTraversal(parent);
    console.log('层序遍历 == ')
    parent.orderTraversal(parent);
  • 相关阅读:
    python的正则表达式 re-------可以在字符串前加上 r 这个前缀来避免部分疑惑,因为 r 开头的python字符串是 raw 字符串,所以里面的所有字符都不会被转义
    mysql中max_allowed_packet参数的配置方法(避免大数据写入或者更新失败)
    提交 git 项目 到 github 在 centos 7
    常用正则表达式大全 (转)
    如何让vim编辑器永久显示行号
    Ubuntu下忘记MySQL密码重设方法
    Base64复习
    好用的正则表达式工具
    64位centos下安装python的PIL模块
    springboot中使用servlet通过配置类
  • 原文地址:https://www.cnblogs.com/strivegys/p/13207401.html
Copyright © 2011-2022 走看看