【博乐科技笔试题】通过二叉搜索树的后序遍历输出其先序遍历

public class TreeNode {
    public int val;
    public TreeNode left;
    public TreeNode right;
    public TreeNode() {}
    public TreeNode(int val) { this.val = val; }
    public TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
public static void main(String[] args) {
    int[] xx=printResult(new int[]{3,6,5,9,8,11,13,12,10});
    for (int x:xx) {
        System.out.print(x+",");
    }
}
//根据二叉搜索树的后序遍历,输出其先序遍历
public static int[] printResult (int[] arr) {
    // write code here
    int[] hx=new int[arr.length];
    for (int i = 0; i < arr.length; i++) {
        hx[i]=arr[i];
    }
    Arrays.sort(arr);//arr变成中序遍历了
    TreeNode root=build(arr,hx);
    List<List<Integer>> re=traverseByLevel.levelTraverse2(root);
    int[] xx=new int[arr.length];
    int i=0;
    for (List<Integer> l:re) {
        for (int n:l) {
            xx[i++]=n;
        }
    }
    return xx;
}

//根据后序遍历和中序遍历构造二叉树
public static TreeNode build(int[] zx,int[] hx){
    if (zx.length<=1){
        TreeNode re=new TreeNode();
        re.val=zx[0];
        return zx.length==0?null:re;
    }
    int len=zx.length;
    TreeNode root=new TreeNode();
    root.val=hx[len-1];
    int mid=0;//得到根节点在中序数组中的位置
    for (int i = 0; i < len; i++) {
        if (zx[i]==hx[len-1]){
            mid=i;
        }
    }
    int[] zxleft=new int[mid];
    int[] hxleft=new int[mid];
    for (int i = 0; i < mid; i++) {
        zxleft[i]=zx[i];
        hxleft[i]=hx[i];
    }
    int[] zxright=new int[len-mid-1];
    int[] hxright=new int[len-mid-1];
    for (int i = mid+1; i < len; i++) {
        zxright[i-mid-1]=zx[i];
        hxright[i-mid-1]=hx[i-1];
    }
    root.left=build(zxleft,hxleft);
    root.right=build(zxright,hxright);
    return root;
}
static List<List<Integer>> res = new LinkedList<>();
//递归实现二叉树的层序遍历
public static List<List<Integer>> levelTraverse2(TreeNode root) {
    if (root==null){
        return null;
    }
    List<TreeNode> levelNodes=new LinkedList<>();
    levelNodes.add(root);//第一层
    traverse(levelNodes);
    return res;
}
private static void traverse(List<TreeNode> levelNodes){
    if (levelNodes.isEmpty()){
        return;
    }
    //存储当前层的节点的值
    List<Integer> nodesValue=new LinkedList<>();
    //下一层的节点列表
    List<TreeNode> nextLevelNodes=new LinkedList<>();
    for (TreeNode n:levelNodes) {
        nodesValue.add(n.val);
        if (n.left!=null){
            nextLevelNodes.add(n.left);
        }
        if (n.right!=null){
            nextLevelNodes.add(n.right);
        }
    }
    // 前序位置添加结果,可以得到自顶向下的层序遍历
    res.add(nodesValue);
    traverse(nextLevelNodes);
    // 后序位置添加结果,可以得到自底向上的层序遍历结果
    // res.add(nodesValue);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值