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

这篇博客介绍了二叉树的前序和后序遍历两种方法。前序遍历使用递归和借助栈的方式,首先将根节点压栈,然后按照右-左-根的顺序处理节点。后序遍历同样借助两个栈,先将根节点入栈A,再将左右子节点依次入栈B,最后按照栈B的出栈顺序得到后序遍历序列。
摘要由CSDN通过智能技术生成

二叉树

前序遍历

递归

借助栈进行排序

  1. 先将根节点压栈
  2. 栈不为空,如果存在根节点,先右后左。
  3. 弹栈打印。直至栈为空
package com.vitamin.tree;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * @author 
 * 2022/4/7 11:06
 */
public class PreOrderTree {


    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);

        while (!stack.isEmpty()) {
            TreeNode pop = stack.pop();
            list.add(pop.val);
            if (pop.right != null) {
                stack.push(pop.right);
            }
            if (pop.left != null) {
                stack.push(pop.left);
            }
        }
        return list;
    }

    public void preOrder(TreeNode root, int type) {
        if (root == null) {
            return;
        }
        System.out.println(root.val);
        preOrder(root.left, 1);
        preOrder(root.right, 1);
    }
}

后序遍历

递归

借助两个栈

  1. 先押入跟节点到栈A.

  2. 栈不为空,如果存在根节点,先左后右

  3. 弹栈压入栈B.zhan

  4. 最后的打印顺序是 栈B的出栈顺序

辅助栈B的入栈顺序是 跟右左

代码实现

package com.vitamin.tree;

import com.vitamin.list.ListNode;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

/**
 * @author 
 * 2022/4/7 11:12
 */
public class PostOrderTree {


    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if (root == null) {
            return list;
        }
        Stack<TreeNode> stackTemp = new Stack<>();
        Stack<TreeNode> stack = new Stack<>();
        stackTemp.push(root);
        while (!stackTemp.isEmpty()) {
            TreeNode pop = stackTemp.pop();
            stack.push(pop);
            if (pop.left != null) {
                stackTemp.push(pop.left);
            }
            if (pop.right != null) {
                stackTemp.push(pop.right);
            }

        }
        while (!stack.isEmpty()) {
            TreeNode pop = stack.pop();
            list.add(pop.val);

        }
        return list;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值