数据结构与算法---输出打印的前序遍历、中序遍历、后序遍历+将节点值存入数组/其他数据结构的前中后序遍历

概述:

主要讲解前序遍历、中序遍历、后序遍历的Java代码实现。

正文:

对下图所示二叉树为测试对象:

在这里插入图片描述
二叉树基于如下的数据结构:

public class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    public TreeNode(int x) { val=x; }
}
1.前序遍历:
void preOrderTraverse(TreeNode node) {
    if(node==null) return;
    System.out.println(node.val);
    preOrderTraverse(node.left);
    preOrderTraverse(node.right);
}
2.中序遍历
void inOrderTraverse(TreeNode node) {
    if(node==null) return;
    inOrderTraverse(node.left);
    System.out.println(node.val);
    inOrderTraverse(node.right);
}
3.后序遍历
void postOrderTraverse(TreeNode node) {
    if(node==null) return;
    postOrderTraverse(node.left);
    postOrderTraverse(node.right);
    System.out.println(node.val);
}
以上的这三个算法实现都是直接打印数据,假设我们需要把数据存储到一个数组中然后再返回的,代码如何实现呢?

见下方所示:

/*递归的主要实现是函数 recur(ArrayList<Integer> res, TreeNode node),与上方的没有返回值的前中后序遍历的代码不同,recur()方法接受两个参数,一个是用于存储结果数据的res,另外一个才是用于后序递归的子树node */
public int[] preOrderTraverse_(TreeNode node) {
    //因为是树结构,无法知道节点个数,所以建立数组列表,而不是普通数组
    ArrayList<Integer> res=new ArrayList<>();
    recur(res,node);//递归函数
    //将递归产生的res数组列表转化为数组
    int[] result=new int[res.size()];
    for(int i=0; i<res.size(); i++)
        result[i]=res.get(i);
    return result;
}
//递归函数定义:前序遍历
private void recur(ArrayList<Integer> res, TreeNode node){
    if(node==null) return;
    res.add(node.val);
    recur(res,node.left);
    recur(res,node.right);
}
测试代码如下:
public class CodeTest {
    public static void main(String[] args) {
        TreeNode node1=new TreeNode(1);
        TreeNode node3=new TreeNode(3);
        TreeNode node5=new TreeNode(5);
        TreeNode node2=new TreeNode(2,node1,node3);
        TreeNode node4=new TreeNode(4,node2,node5);
        System.out.println(Arrays.toString(preOrderTraverse_(node4)));
    }

    public static int[] preOrderTraverse_(TreeNode node) {
        //因为是树结构,无法知道节点个数,所以建立数组列表,而不是普通数组
        ArrayList<Integer> res=new ArrayList<>();
        recur(res,node);//递归函数
        //将递归产生的res数组列表转化为数组
        int[] result=new int[res.size()];
        for(int i=0; i<res.size(); i++)
            result[i]=res.get(i);
        return result;
    }
    //递归函数定义:前序遍历
    private static void recur(ArrayList<Integer> res, TreeNode node){
        if(node==null) return;
        res.add(node.val);
        recur(res,node.left);
        recur(res,node.right);
    }
}
//树的数据结构
class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val=x; }
    TreeNode(int x, TreeNode l, TreeNode r){
        val=x;
        left=l;
        right=r;
    }
}

测试代码运行结果为:

[4,2,1,3,5]
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值