输入先序和中序构造二叉树

来源:互联网 发布:信欣美妆淘宝店假货 编辑:程序博客网 时间:2024/05/22 15:12

这里写图片描述

public static TreeNode reConstructTreeNode(int[] pre,int[] in)    {        //获取节点的根        int rootVal = pre[0];        //定义一个节点,将根节点值赋值给构造的节点        TreeNode treeNode = new TreeNode(rootVal);        //获取根的左子树的中序        ArrayList<Integer> li = new ArrayList<Integer>();        int rootPos = 0;        for (int i = 0; rootVal != in[i] ; i++) {            rootPos ++;            li.add(in[i]);        }        //获取根的右子树的中序        ArrayList<Integer> ri = new ArrayList<Integer>();        for (int i = rootPos + 1; i < in.length; i++) {            ri.add(in[i]);        }        //获取根的左子树的先序        ArrayList<Integer> lp = new ArrayList<Integer>();        for (int i = 1; i < rootPos + 1; i++) {            lp.add(pre[i]);        }        //获得根的右子树的先序        ArrayList<Integer> rp = new ArrayList<Integer>();        for (int i = rootPos + 1; i < pre.length; i++) {            rp.add(pre[i]);        }        if(lp.size() == 0 || li.size() == 0)        {            treeNode.leftTree = null;        }        else if(rp.size() == 0 || rp.size() == 0)        {            treeNode.rightTree = null;        }        //若左右子树都不为空        if(lp.size() != 0)        {            //左先序赋值给数组            int[] lpArr = new int[lp.size()];            for (int i = 0; i < lpArr.length; i++) {                lpArr[i] = lp.get(i);            }            //左中序赋值给数组            int[] liArr = new int[li.size()];            for (int i = 0; i < liArr.length; i++) {                liArr[i] = li.get(i);            }            //右先序赋值给数组            int[] rpArr = new int[rp.size()];            for (int i = 0; i < rpArr.length; i++) {                rpArr[i] = rp.get(i);            }            //右先序赋值给数组            int[] riArr = new int[ri.size()];            for (int i = 0; i < riArr.length; i++) {                riArr[i] = ri.get(i);            }            treeNode.leftTree = reConstructTreeNode(lpArr, liArr);        }        if(rp.size() != 0)        {            //左先序赋值给数组            int[] lpArr = new int[lp.size()];            for (int i = 0; i < lpArr.length; i++) {                lpArr[i] = lp.get(i);            }            //左中序赋值给数组            int[] liArr = new int[li.size()];            for (int i = 0; i < liArr.length; i++) {                liArr[i] = li.get(i);            }            //右先序赋值给数组            int[] rpArr = new int[rp.size()];            for (int i = 0; i < rpArr.length; i++) {                rpArr[i] = rp.get(i);            }            //右先序赋值给数组            int[] riArr = new int[ri.size()];            for (int i = 0; i < riArr.length; i++) {                riArr[i] = ri.get(i);            }            treeNode.rightTree = reConstructTreeNode(rpArr, riArr);        }        return treeNode;    }

节点的类:

class TreeNode{    int Val;    TreeNode leftTree;    TreeNode rightTree;    TreeNode(int Val)    {        this.Val = Val;    }    }
0 0
原创粉丝点击