美文网首页
二叉树的迭代、递归遍历

二叉树的迭代、递归遍历

作者: LuLuX | 来源:发表于2018-04-13 13:05 被阅读0次

刷LeetCode刷到遍历二叉树的题目,前序(题号144,中等),中序(题号94,中等),后序(题号145,困难)。递归比较简单,但是题目建议可以用迭代,三道题用简单的递归也都可以通过,迭代的思路难一点。

JavaScript实现
前序-递归法:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
// 前序遍历,递归法
var preorderTraversal = function(root) {
    var res = [];
    res = getNode(root);
    return res;
};
var getNode = function(root){
    if(root === null){
        return [];
    }

    var arr = [];
    arr = [root.val].concat(getNode(root.left));
    arr = arr.concat(getNode(root.right));
    return arr;
};

前序-迭代法:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
// 前序遍历,迭代法
var preorderTraversal = function(root) {
    var cur = root;
    var res = [];
    var stack = [];
    while(cur || stack.length!==0){
        if(!cur){
            cur = stack.pop();
        }
        res.push(cur.val);
        if(cur.right){
            stack.push(cur.right);
        }
        cur = cur.left;
    }

    return res;
};

中序-递归法:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
// 题目要求用迭代,先写个递归看看
var inorderTraversal = function(root) {
    var res = [];
    res = getNode(root);
    return res;
};
var getNode = function(root){
    if(root === null){
        return [];
    }
    if(root.left===null && root.right===null){
        return [root.val];
    }
    var arr = [];
    // 左中右,中序遍历
    arr = getNode(root.left).concat([root.val]);
    arr = arr.concat(getNode(root.right));
    return arr;
};

中序-迭代法:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
// 迭代
var inorderTraversal = function(root) {
    if(root === null){
        return [];
    }
    var res = [];
    var stack = [];
    var cur = root;
    while(cur!==null || stack.length!==0){
        if(cur !== null){
            stack.push(cur);
            cur = cur.left;
        }else{
            cur = stack.pop();
            res.push(cur.val);
            cur = cur.right;
        }
    }
    return res;
};


后序-递归法:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
var postorderTraversal = function(root) {
    var res = [];
    res = getNode(root);
    return res;
};
var getNode = function(root){
    if(root === null){
        return [];
    }
    if(root.left===null && root.right===null){
        return [root.val];
    }
    var arr = [];
    arr = getNode(root.left).concat(getNode(root.right));
    arr = arr.concat([root.val]);
    return arr;
};

后序-迭代法:

/**
 * Definition for a binary tree node.
 * function TreeNode(val) {
 *     this.val = val;
 *     this.left = this.right = null;
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
// 迭代
var postorderTraversal = function(root) {
    if(root === null){
        return [];
    }
    var res = [];
    var stack = [];
    var cur = root;
    while(cur || stack.length!==0){
        if(cur){
            stack.push(cur);
            cur = cur.left;
        }else{
            // 检查还有没有右边
            if(stack[stack.length-1].right){
                cur = stack[stack.length-1].right;
                stack[stack.length-1].right = null;
            }else{
                cur = stack.pop();
                res.push(cur.val);
                cur = null;
            }
        }
    }
    return res;
};

上面递归的方法其实没必要用两个function的,不过算了懒得改了。。看得明白就行

相关文章

  • 算法-二叉树算法总结

    二叉树算法总结 1 二叉树的遍历 1.1 前序遍历 递归 迭代 1.2 中序遍历 递归 迭代 1.3 后序遍历 递...

  • 二叉树算法基础

    二叉树节点 1 前序遍历 1.1 递归遍历 1.2 迭代遍历 2 中序遍历 2.1 递归遍历 2.2迭代遍历 3 ...

  • 07-13:二叉树review1

    二叉树review1: 1、二叉树结构 1)二叉树的遍历 0)递归/迭代实现 前/中/后序遍历 递归 迭代 层次遍...

  • 考研--二叉树

    1、叉树的层次遍历 2、前序遍历 递归 迭代 3、中序遍历 递归 迭代 4、后续遍历 递归 迭代 后续遍历的做法如...

  • 二叉树前中后遍历迭代法

    递归遍历只要修改递归的顺序即可 记录一下二叉树前中后遍历的迭代法 /** *统一一下 *@paramroot *@...

  • LeetCode 二叉树的中序遍历

    二叉树的中序遍历 二叉树的中序遍历 顺序其实就是 左 中 右用递归的解法来解: 迭代解法:

  • 算法精选题总结之二叉树类

    1.二叉树的中序遍历中序遍历的迭代方法中序遍历的递归方法2.二叉树前序遍历3.二叉树后续遍历4.二叉树的最近公共祖...

  • LeetCode 二叉树的后序遍历

    给定一个二叉树,返回它的 后序 遍历。 非递归(迭代): 后序遍历递归定义:先左子树,后右子树,再根节点。 后序遍...

  • 二叉树遍历-JAVA实现

    基础二叉树 二叉树遍历分为前序、中序、后序递归和非递归遍历、还有层序遍历。 前序递归遍历算法:访问根结点-->递归...

  • 二叉树遍历(递归+迭代)

    前序遍历 递归版 迭代版 中序遍历 递归版 迭代版 后序遍历 递归版 迭代版(这个有点难度,要记录一个prev) ...

网友评论

      本文标题:二叉树的迭代、递归遍历

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