二叉树——不建树遍历

这里写图片描述
原理和我写过的“二叉树——根据先序(后序)和中序遍历建树”中的原理是相同的,除了一个层序遍历,这里说明一下层序遍历的原理:
加一个变量index,表示当前的根结点在二叉树中所对应的下标(从1开始),所以进行一次输出先序的递归的时候,就可以把根结点下标所对应的值存储在level数组中(一开始把level都置为0(或其他值)表示此处没有结点),这样在递归完成后level数组中非0的数就是按照下标排列的层序遍历的顺序。

/*
 * 在不建树的情况下,根据先序
 * (后序)和中序遍历输出后序(先序)和层序遍历
 */
import java.util.*;
public class OrderTree {
    static int[] pre = {1, 2, 3, 4, 5, 6};
    static int[] post = {3, 4, 2, 6, 5, 1};
    static int[] in = {3, 2, 4, 1, 6, 5};
    static int[] level = new int[10000];
    static public void preOrder(int rootindex, int start, int end) {
        if(start > end) return ;
        int i = start;
        while(i <= end && in[i] != post[rootindex]) i++;
        System.out.printf("%d ", post[rootindex]);
        preOrder(rootindex - (end - i) - 1, start, i - 1);
        preOrder(rootindex - 1, i + 1, end);
    }
    static public void postOrder(int rootindex, int start, int end) {
        if(start > end) return ;
        int i = start;
        while(i <= end && in[i] != pre[rootindex]) i++;
        postOrder(rootindex + 1, start, i - 1);
        postOrder(rootindex + (i - start) + 1, i + 1, end);
        System.out.printf("%d ", pre[rootindex]);
    }
    static public void Order(int rootindex, int start, int end, int index) {
        if(start > end) return ;
        int i = start;
        while(i <= end && in[i] != post[rootindex]) i++;
        level[index] = post[rootindex];
        Order(rootindex - (end - i) - 1, start, i - 1, 2 * index);
        Order(rootindex - 1, i + 1, end, 2 * index + 1);
    }
    public static void main(String[] args) {
        preOrder(5, 0, 5);
        System.out.println();
        postOrder(0, 0, 5);
        System.out.println();
        Order(5, 0, 5, 1);
        for(int i=1;i<level.length;i++) {
            if(level[i] != 0) {
                System.out.printf("%d ", level[i]);
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值