# 二叉树的中序遍历

# 题目

给定一个二叉树,返回它的 中序 遍历。

# 示例

输入: [1,null,2,3]
   1
    \
     2
    /
   3
输出: [1,3,2]

请分别以 递归非递归 方法实现?

# 代码

# Johninch

本部分是三序遍历的实现,主要分为两类:递归和迭代 三序遍历的递归方式非常简单,而对应的迭代法,本质上是在模拟递归,因为在递归的过程中使用了系统栈,所以在迭代的解法中常用Stack来模拟系统栈。 其实三序遍历都有一种莫里斯遍历解法,但这种方法会破坏原树结构,且不易理解,感兴趣的话去leetcode研究下。

# 中序遍历 - 递归

const inorder = (root, arr = []) => {
    if (root) {
        inorder(root.left, arr)
        arr.push(root.val)
        inorder(root.right, arr)
    }

    return arr
}

# 中序遍历 - 迭代 - 栈遍历 (中序出栈再输出)

const inorderTraversal = (root) => {
    const res = [];
    const stack = [];
    let current = root;

    while (current || stack.length > 0) {
        while (current) {
            stack.push(current);
            current = current.left;
        }

        current = stack.pop();
        res.push(current.val); // 前序入栈就输出,中序出栈再输出,后续是对前序的修改

        current = current.right;
    }

    return res;
};

# niannings

/**
 * 中序遍历算法:
 * 1. 初始化一个指针node指向根节点,初始化一个栈stack,并将node压入;
 * 2. 如果node存在便将node压入stack并将其左子节点赋给node,如果不存在则从stack弹出一个赋给node,**并访问node**,然后将node的右子节点赋给node;
 * 3. 重复步骤2,直到stack清空
 * @param handler 处理函数
 */
export function middleEach<N extends IBinaryTreeNodeBase = IBinaryTreeNodeBase>(
    root: N,
    handler: (node: N) => void
) {
    if (root === null) return;
    let node = root;
    const stack = [];
    while (stack.length || node) {
        if (node) {
            stack.push(node);
            node = node.left as N;
        } else {
            node = stack.pop();
            // 提供退出遍历能力
            if (isFalse(handler(node as N))) {
                break;
            }
            node = node.right as N;
        }
    }
}

# febcat

inorderTraversal(node = this.root) {
    let inorderTraverArr = [];

    const loop = (node) => {
        if (!node) {
            return;
        }

        loop(node.left);
        inorderTraverArr.push(node.data);
        loop(node.right);
    }

    loop(node);

    console.log("中序排列:", inorderTraverArr);
    return inorderTraverArr;
}

inorderTraversal2(node = this.root) {
    if (!node) {
      return;
    }

    let stack = [];
    let inorderTraversalArr = [];

    while (stack.length || node) {
      if (node) {
        stack.push(node);
        node = node.left;
      } else {
        node = stack.pop();
        inorderTraversalArr.push(node.data);
        node = node.right;
      }
    }

    console.log("中序遍历迭代:", inorderTraversalArr);
    return inorderTraversalArr;
  }
Last Updated: 4/9/2020, 4:16:49 PM