美文网首页
二叉树遍历

二叉树遍历

作者: Jason_Shu | 来源:发表于2019-01-05 14:58 被阅读0次
// 递归版 中序
function inOrder(root) {
    if(root === null) return;
    inOrder(root.left);
    console.log(root.data);
    inOrder(root.right);
}

// 非递归版 中序
function inOrder(root) {
    // 运用一个堆栈stack
    let stack = [];
    let result = [];

    while(stack.length > 0 || root !== null) {
        if(root!== null) {
            stack.push(root);
            root = root.left;
        } else {
            let node = stack.pop();
            result.push(node.data);
            if(node.right !== null) {
                root = node.right;
            }
        }
    }
    return result;
}

// 递归版 前序
function preOrder(root) {
    if(root === null) return;
    console.log(root.data);

    preOrder(root.left);
    preOrder(root.right);
}

// 非递归版 前序
function preOrder(root) {
    let stack = [];
    let result = [];

    while(stack.length > 0 || root !== null) {
        if(root !== null) {
            stack.push(root);
            result.push(root.data);
            root = root.left;
        } else {
            let node = stack.pop();
            if(node.right !== null) {
                root = node.right;
            }
        }
    }
    return result;
}

function preOrder(root) {
    let stack = [];
    let result = [];
    if(!(root)) return [];
    stack.push(root);
    while(stack.length > 0) {
        let node = stack.pop();
        result.push(node.val);
        // 堆栈的特点:先进后出,所以我们先把右孩子放进去stack。
        if(node.right !== null) {
            stack.push(node.right);
        }
        if(node.left !== null) {
            stack.push(node.left);
        }
    }
    return result;
}

// 递归版 后序
function pastOrder(root) {
    if(root === null) return;
    pastOrder(root.left);
    pastOrder(root.right);
    console.log(root.data)
}

// 非递归 后序
var postOrder = function(root) {
    // 运用两个堆栈
    let result = [];
    let stack1 = [];
    let stack2 = [];

    if(!(root)) return [];

    stack1.push(root);

    while(stack1.length > 0) {
        let node = stack1.pop();
        stack2.push(node);
        if(node.left !== null) {
            stack1.push(node.left)
        }
        if(node.right !== null) {
            stack1.push(node.right)
        }
    }
    while(stack2.length > 0) {
        result.push(stack2.pop().val);
    }

    return result;
};


//  层次遍历
var levelOrder = function(root) {
    let hash = {};
    let result = [];
    let queue = [];
    if(!(root)) return [];

    // 用queue队列来装「元素」,这个「元素」是个数组,由两部分组成
    // 第一部分是「level层级」,第二部分是原本的「Node」
    queue.push([0, root]);

    while(queue.length > 0) {
        let current = queue.shift();
        let level = current[0];
        let node = current[1];
        //  hash 初始化
        
        if(hash[level] === undefined) {
            hash[level] = [];
        }

        hash[level].push(node.data);


        if(node.left !== null) {
            queue.push([level + 1, node.left])
        }

        if(node.right !== null) {
            queue.push([level + 1, node.right])
        }

    }
    for(let key in hash) {
        result.push(hash[key]);
    }
    return result;

};


相关文章

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • 关于二叉树的算法题

    前序遍历中序遍历后序遍历判断是否是平衡二叉树判断是否是对称二叉树判断二叉树高度按照层遍历二叉树判断二叉树宽度

  • 二叉树遍历

    二叉树 二叉树的存储结构 前序遍历 中序遍历 后序遍历 遍历代码 反转二叉树 深入学习二叉树 二叉树-你必须要懂!...

  • 二叉树操作

    树节点 逐行顺序解析二叉树 前序遍历二叉树 中序遍历二叉树 后序遍历二叉树 删除指定数值的节点 前序遍历顺序存储的...

  • 数据结构与算法之二叉树遍历(七)

    目录 前序遍历中序遍历后序遍历层序遍历遍历方式的选择条件根据遍历结果重构二叉树翻转二叉树计算二叉树的高度判断一棵树...

  • 二叉树三种遍历Swift代码实现

    二叉树的三种遍历 二叉树 前序遍历 中序遍历 后序遍历 另外 不得不说,得到二叉树的前序遍历和中序遍历的结果或者后...

  • 二叉树的遍历

    二叉树的遍历 二叉树遍历 分为前序遍历、中序遍历和后序遍历。 前序遍历 (DLR) 先访问根节点,然后前序遍历左子...

  • 前端二叉树

    (一)构造二叉树 (二)中序遍历 (三)前序遍历 前序遍历可以复制二叉树,效率比重新构造二叉树高 (四)后序遍历 ...

  • 数据结构:树的实现和遍历(c++)

    (一)二叉树的遍历——递归实现 二叉树常见的遍历方式分为前序遍历、中序遍历和后序遍历。 1 前序遍历 前序遍历也叫...

  • leetcode 144 145 94

    二叉树遍历 前序遍历 中序遍历 后序遍历

网友评论

      本文标题:二叉树遍历

      本文链接:https://www.haomeiwen.com/subject/ragrrqtx.html