美文网首页
二叉树的前中后序遍历

二叉树的前中后序遍历

作者: JAVA觅音阁 | 来源:发表于2019-10-15 12:35 被阅读0次

二叉树的前中后遍历,其前中后,您可理解为指的是根结点所在的序。

  • 前序遍历:前序遍历的顺序为根-左-右
  • 中序遍历:中序遍历的顺序为左-根-右
  • 后序遍历:后序遍历的顺序为左-右-根

1.前序遍历

思路:利用栈后进先出的特性。

1.根结点入栈;
2.循环取栈顶元素、右子结点入栈、左子结点入栈。

JAVA参考代码

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
​
    TreeNode(int val) {
        this.val = val;
    }
}
public List<Integer> preorderTree(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    List<Integer> preorder = new ArrayList<>();
​
    if (root == null) {
        return preorder;
    }
​
    stack.push(root);
    while (!stack.empty()) {
        TreeNode node = stack.pop();
        preorder.add(node.val);
        if (node.right != null) {
            stack.push(node.right);
        }
        if (node.left != null) {
            stack.push(node.left);
        }
    }
​
    return preorder;
}

2.中序遍历

思路:利用栈后进先出的特性。

1.根结点入栈;
2.所有左子结点入栈;
3.循环取出栈顶元素、判断右子结点是否为空:
4.为空:取栈顶元素、若当前元素为栈顶元素右子树,弹出丢弃即可;(此时根结点已被上述访问取出)
5.不为空:入栈、然后所有子节点入栈。

JAVA参考代码

public List<Integer> inorderTree(TreeNode root) {
    Stack<TreeNode> stack = new Stack<>();
    List<Integer> inorder = new ArrayList<>();
​
    while (root != null) {
        stack.push(root);
        root = root.left;
    }
​
    while (!stack.isEmpty()) {
        TreeNode node = stack.peek();
        inorder.add(node.val);
​
        if (node.right == null) {
            node = stack.pop();
            while (!stack.isEmpty() && stack.peek().right == node) {
                node = stack.pop();
            }
        } else {
            node = node.right;
            while (node != null) {
                stack.push(node);
                node = node.left;
            }
        }
    }
    return inorder;
}

3.后序遍历

思路:借助全局变量,递归左子结点、递归右子结点。

JAVA参考代码

List<Integer> result = new ArrayList<>();
​
public List<Integer> postorderTree(TreeNode root) {
    TreeNode cur = root;
​
    if(cur == null) {
        return result;
    }
    if(cur.left != null) {
        postorderTree(cur.left);
    }
    if(cur.right != null) {
        postorderTree(cur.right);
    }
    result.add(cur.val);
    return result;
}

相关文章

  • 2018-09-07

    二叉树的前中后序遍历 二叉树由左子树、右子树和根组成(L, R,D) 前,中,后序遍历是针对根节点来说的。DLR ...

  • 二叉树的遍历方式

    二叉树的遍历方式有多种,前序遍历,中序遍历,后序遍历,层序遍历,在这里来介绍一下前、中、后序遍历。 前序遍历:根左...

  • 递归调用中的递归序

    从刚开始接触递归,到接触二叉树递归遍历,简单几行代码就能实现前中后序遍历,而且,前中后序遍历的代码基本一致,觉得好...

  • leetcode 144 145 94

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

  • 二叉树的遍历与创建

    二叉树的遍历 分为:前序,中序,后序,层序。 前/中/后序,是根据跟节点遍历的前后顺序来定义的。 前序遍历 从根节...

  • goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序

    goLang 二叉树遍历(递归 非递归 前序遍历 中序遍历 后序遍历 层序遍历) 前序遍历 中序遍历 后序遍历 代...

  • 二叉树的各种遍历方法

    二叉树的常用遍历方法 二叉树常用的遍历方法包括: 前序遍历 中序遍历 后序遍历 层次遍历 而前三种遍历的具体实现上...

  • 二叉树的一些基本知识总结

    学了学二叉树,这里说说怎样遍历二叉树.四种方式:前序遍历,中序遍历,后序遍历,层次遍历. 主要说说递归的遍历方法前...

  • POJ 2255 Tree Recovery(根据前中序遍历,重

    题意:给出二叉树的前序遍历和中序遍历,求后序遍历。 NO.1:无需重建二叉树,可直接求出后序遍历结果。 NO.2 ...

  • leecode刷题(30)-- 二叉树的后序遍历

    leecode刷题(30)-- 二叉树的后序遍历 二叉树的后序遍历 给定一个二叉树,返回它的 后序 遍历。 示例:...

网友评论

      本文标题:二叉树的前中后序遍历

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