二叉树的前中后序遍历

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

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

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;
}

更多文章欢迎扫码关注公众号 [JAVA觅音阁] 查看

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值