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

二叉树的前序中序后序遍历-含递归和迭代代码

  • 前序(中左右)
  • 中序(左中右)
  • 后序(左右中)

前序(中左右)

对于二叉树中的任意一个节点,先打印该节点,然后是它的左子树,最后右子树

  • A-B-D-E-C-F

二叉树的前序中序后序遍历_第1张图片

//递归
const preorderTraversal = (root) => {
  const res = [];
  const preOrder = (root) => {
    if (root == null) return;
    res.push(root.val);
    preOrder(root.left);
    preOrder(root.right);
  };
  preOrder(root);
  return res;
}

//迭代:利用栈特性,后进先出 我们常用的循环其实就是迭代,比如:for,while,do ... while...循环等,都属于迭代。
const preorderTraversal = (root) {
    var res = [];
    if(!root) return res;
    var stack = [root];
    while(stack.length !== 0){
        var node = stack.pop();
        res.push(node.val);
        if(node.right){
            stack.push(node.right);
        }
        if(node.left){
            stack.push(node.left);
        }
    }
    return res;
};

中序(左中右)

对于二叉树中的任意一个节点,先打印它的左子树,然后是该节点,最后右子树

  • D-B-E-A-C-F
    二叉树的前序中序后序遍历_第2张图片

//递归
const inorderTraversal = (root) => {
    const res = [];
    const inorder = (root) => {
        if (root == null) {
            return;
        }
        inorder(root.left); // 先递归左子树
        res.push(root.val); // 将当前节点值推入res
        inorder(root.right); // 再递归右子树
    };
    inorder(root);
    return res;
};

//迭代
const inorderTraversal = (root) => {
  const res = [];
  const stack = [];
  while (root) {        // 能压栈的左子节点都压进来
    stack.push(root);
    root = root.left;
  }
  while (stack.length) {
    let node = stack.pop(); // 栈顶的节点出栈
    res.push(node.val);     // 在压入右子树之前,处理它的数值部分(因为中序遍历)
    node = node.right;      // 获取它的右子树
    while (node) {          // 右子树存在,执行while循环    
      stack.push(node);     // 压入当前root
      node = node.left;     // 不断压入左子节点
    }
  }
  return res;
};

后序(左右中)

对于二叉树中的任意一个节点,先打印它的左子树,然后是右子树,最后该节点

  • D-E-B-F-C-A
    二叉树的前序中序后序遍历_第3张图片
// 递归
const postorderTraversal = (root) {
    let result = []
    var postOrder = (node) => {
        if(node) {
            // 先遍历左子树
            postOrder (node.left)
            // 再遍历右子树
            postOrder (node.right)
            // 最后根节点
            result.push(node.val)
        }
    }
    postOrder(root)
    return result
};

//迭代
//思路
//后序遍历与前序遍历不同的是:
//后序遍历是左右根
//而前序遍历是根左右
//如果我们把前序遍历的 res.push(node.val) 变更为 res.unshift(node.val) (遍历结果逆序),那么遍历顺序就由 根左右 变更为 右左根
//然后我们仅需将 右左根 变更为 左右根 即可完成后序遍历


const postorderTraversal = (root) => {
 var res = [];
    if(!root) return res;
    var stack = [root];
    while(stack.length !== 0){
        var node = stack.pop();
        // 根左右=>右左根
        res.unshift(node.val);
         // 先进栈左子树后右子树
        // 出栈的顺序就变更为先右后左
        // 右先头插法入list
        // 左再头插法入list
        // 实现右左根=>左右根
         if(node.left){
            stack.push(node.left);
         }
         if(node.right){
            stack.push(node.right);
        }
    }
    return res;
}

你可能感兴趣的:(java,javascript,开发语言)