数据结构与算法:二叉树三种遍历的java实现

题源:
144.二叉树的前序遍历
94.二叉树的中序遍历
145.二叉树的后序遍历

第一种方法:递归实现

比较简单,记住三种遍历的顺序即可

//二叉树的前序遍历
public class PreOrderTraversal {
    public List<Integer> preOrderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();

        //递归跳出的条件
        if(root==null) {
            return list;
        }
        list.add(root.val);

        //递归添加root的左节点
        preOrderTraversal(root.left);
        //递归添加root的右节点
        preOrderTraversal(root.right);
        return list;
    }
}
package com.algorithm.binarytree;

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

/**
 * @program: Java IDEA Projects
 * @create: 2022-01-21 14:56
 **/
//二叉树的中序遍历
public class InOrderTraversal {
    public List<Integer> inOrderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        inOrder(root,list);
        return list;
    }
    //左子树-根结点-右子树
    public void inOrder(TreeNode treeNode,List<Integer> list) {
        if(treeNode==null) {
            return;
        }
        inOrder(treeNode.left,list);
        list.add(treeNode.val);
        inOrder(treeNode.right,list);
    }
}

package com.algorithm.binarytree;

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

/**
 * @program: Java IDEA Projects
 * @create: 2022-01-21 15:53
 **/
//二叉树的后序遍历
public class PostOrderTraversal {
    public List<Integer> postOrderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        postOrder(root,list);
        return list;
    }
    //左子树-右子树-根节点
    public void postOrder(TreeNode treeNode,List<Integer> list) {
        if(treeNode==null) return;
        postOrder(treeNode.left,list);
        postOrder(treeNode.right,list);
        list.add(treeNode.val);
    }
}

第二种方法:迭代实现(栈)

前序遍历
在这里插入图片描述

    //二叉树前序遍历
    public List<Integer> preOrderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        if(root==null) return list;
        //模拟栈的结构
        Deque<TreeNode> deque=new ArrayDeque<>();
        //先将根节点压入栈
        deque.push(root);

        //非空时迭代
        while(!deque.isEmpty()) {
            TreeNode temp=deque.pop();
            list.add(temp.val);

            //判断是否非空
            //这里先放右子树是因为栈的先进后出特性
            //如果要得到左子树就要先将右子树压入栈
            if(temp.right!=null) deque.push(temp.right);
            if(temp.left!=null) deque.push(temp.left);

        }

        return list;
    }

中序遍历

在这里插入图片描述
引用leetcode题解动态图方便小伙伴们更好理解
leetcode王尼玛题解

    //二叉树中序遍历
    public List<Integer> inOrderTraversal(TreeNode root) {
        List<Integer> list=new ArrayList<>();
        if(root==null) return list;

        Deque<TreeNode> deque=new ArrayDeque<>();
        //这里要嵌套两个条件,因为我们要找到不断找到节点的左子树把它压入栈中
        while(!deque.isEmpty() || root!=null) {
            while (root!=null) {
                //把左节点压入栈中
                deque.push(root);
                //root等于root左节点
                root=root.left;
            }
            //此时的root是最左边的节点,也就是中序遍历的第一个节点
            root=deque.pop();
            list.add(root.val);

            //把当前子节点的左子树和当前子节点都弹出,再检查root的右节点
            //如果右节点为空,就不会进入内嵌循环
            root=root.right;
        }

        return list;
    }

后序遍历
在这里插入图片描述

    //二叉树后序遍历
    public List<Integer> postOrderTraversal(TreeNode root) {
        //用LinkedList实现将root插到链表头部,即栈底
        LinkedList<Integer> list=new LinkedList<>();
        if(root == null) return list;

        Deque<TreeNode> deque=new ArrayDeque<>();
        deque.push(root);

        while(!deque.isEmpty()) {
            TreeNode temp=deque.pop();
            list.addFirst(temp.val);
            
            //和前序遍历相反即可
            if(temp.left!=null) deque.push(temp.left);
            if(temp.right!=null) deque.push(temp.right);
        }

        return list;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值