题解 | #实现二叉树先序,中序和后序遍历#javascript递归和迭代解法

实现二叉树先序,中序和后序遍历

http://www.nowcoder.com/practice/a9fec6c46a684ad5a3abd4e365a9d362

NC45 实现二叉树先序,中序和后序遍历

中等

知识点:栈、树、哈希 描述 给定一棵二叉树,分别按照二叉树先序,中序和后序打印所有的节点。

数据范围:0 \le n \le 10000≤n≤1000,树上每个节点的val值满足 0 \le val \le 1000≤val≤100 要求:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n) 样例解释: 如图二叉树结构 示例1 输入: {1,2,3} 复制 返回值: [[1,2,3],[2,1,3],[2,3,1]] 复制 说明: 如题面图

1. 递归

思路:

递归较简单,对前序根左右、中序左根yo右、后序左右根的规律设计递归即可,代码如下:

/*
 * function TreeNode(x) {
 *   this.val = x;
 *   this.left = null;
 *   this.right = null;
 * }
 */

/**
 * 
 * @param root TreeNode类 the root of binary tree
 * @return int整型二维数组
 */
function threeOrders( root ) {
    // write code here
    let arr1 = new Array(), arr2 = new Array(), arr3 = new Array();
    preorder(root, arr1);
    inorder(root, arr2);
    postorder(root, arr3);
    return [arr1, arr2, arr3];
}
function preorder(root, arr1) {
    if(!root) return;
    arr1.push(root.val);
    preorder(root.left, arr1);
    preorder(root.right, arr1);
}
function inorder(root, arr2) {
    if(!root) return;
    inorder(root.left, arr2);
    arr2.push(root.val);
    inorder(root.right, arr2);
}
function postorder(root, arr3) {
   if(!root) return;
    postorder(root.left, arr3);
    postorder(root.right, arr3);
    arr3.push(root.val);
}
module.exports = {
    threeOrders : threeOrders
};

2. 迭代

思路:

前序遍历是根左右,由于根节点是压进去立刻又出栈,真正的压栈顺序是先右再左,代码如下

function preorder(root, arr1) {
    if(!root) return;
    let stack = [];
    stack.push(root);
    while(stack.length) {
        let x = stack.pop();
        arr1.push(x.val);
        if(x.right) stack.push(x.right);
        if(x.left) stack.push(x.left);
    }
}

后序遍历是左右根,由于前序是根左右,所以可看做是前序变换压栈顺序变成根右左后,再把数组倒置过来变成左右根,因此真正的压栈顺序是先左再右,代码如下

function postorder(root, arr3) {
    if(!root) return;
    let stack = [];
    stack.push(root);
    while(stack.length) {
        let x = stack.pop();
        arr3.push(x.val);
        if(x.left) stack.push(x.left);
        if(x.right) stack.push(x.right);
    }
    arr3.reverse();
}

中序遍历是左根右,思路是一直将左孩子压栈,一直到空位置就出栈,即弹出空结点的父亲,输出值后,再将右孩子压栈,重复,直到栈空

function inorder(root, arr2) {
    if(!root) return;
    let stack = [];
    while(root || stack.length) {
        if(root) {
            stack.push(root);
            root = root.left;
        }
        else {
            root = stack.pop();
            arr2.push(root.val);
            root = root.right;
        }
        
    }
}
全部评论

相关推荐

在努力的外卷侠很靠谱:怎么,大家都没保底吗?我这美团已经入职了,不说了,系统派单了。
点赞 评论 收藏
分享
安静的垂耳兔在泡澡:ks已经第八次投递了,它起码挂了还让你再投,不错了
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务