java通过先序遍历和中序遍历获取树结构

     1、首先通过先序遍历找到根节点
     2、在中序遍历中通过该根节点划分左右子树
     3、再根据先序遍历找出左右子树(中序遍历子树)的根节点
     4、重复上述过程,直到无数值

(方法实现有点繁琐,因为拼接字符串,有待改进)

    public static void main(String[] args) {
	// write your code here
        //适用于无相同数字的情况
        List<Integer> hTreeList = new ArrayList<>();
        List<Integer> mTreeList = new ArrayList<>();
        List<Integer> lTreeList = new ArrayList<>();
        List<Integer> rTreeList = new ArrayList<>();
        //先序遍历,根左右
        int [] hTree = {1,2,4,7,3,5,6,8};
        //中序遍历,左根右
        int [] mTree = {4,2,7,1,5,3,8,6};
        for(int j = 0;j<hTree.length;j++){
            hTreeList.add(hTree[j]);
        }
        for(int j = 0;j<mTree.length;j++){
            mTreeList.add(mTree[j]);
        }
        //(1(2(4,7),3(5,6(8,null))))
        StringBuilder tree = new StringBuilder();
        int root = hTreeList.get(0);
        getLeftAndRightTree(hTreeList,mTreeList,root,lTreeList,rTreeList,tree);
        getString(tree);
        System.out.println(tree);
    }

    /**
     * 1、首先通过先序遍历找到根节点
     * 2、在中序遍历中通过该根节点划分左右子树
     * 3、再根据先序遍历找出左右子树(中序遍历子树)的根节点
     * 4、重复上述过程,直到无数值
     */


    /**
     * 处理先序遍历
     * @param hTree
     * @param mTree
     * @param root
     * @param lTree
     * @param rTree
     * @param tree
     */
    public static void getRoot(List<Integer> hTree, List<Integer> mTree, int root, List<Integer> lTree, List<Integer> rTree, StringBuilder tree){
        boolean result = false;
        if(mTree.size() > 1){
            for (Integer ht : hTree) {
                for (Integer mt : mTree) {
                    if(ht.equals(mt)){
                        root = ht;
                        result = true;
                        break;
                    }
                }
                if(result){
                    break;
                }
            }
        }
        getLeftAndRightTree(hTree,mTree,root,lTree,rTree,tree);
    }

    /**
     * 处理中序遍历
     * @param hTree
     * @param mTree
     * @param root
     * @param lTree
     * @param rTree
     * @param tree
     */
    public static void getLeftAndRightTree(List<Integer> hTree, List<Integer> mTree, int root, List<Integer> lTree, List<Integer> rTree, StringBuilder tree){
        lTree.clear();
        rTree.clear();
        boolean result = false;
        for (Integer mt : mTree) {
            //找到根节点
            if(mt.equals(root)){
                if(tree.length()>0){
                    if(tree.substring(tree.length()-1,tree.length()).equals(")")){
                        tree.append(","+mt);
                    }else{
                        if(mTree.size() == 2){
                            tree.append(","+mt);
                        }else{
                            tree.append("("+mt);
                        }

                    }
                }else{
                    tree.append("("+mt);
                }
                result=true;
                continue;
            }
            if(!result){
                //存储左子树
                lTree.add(mt);
            }else {
                //存储右子树
                rTree.add(mt);
            }
        }
        if(lTree.size()==1){
            if(tree.substring(tree.length()-1,tree.length()).equals(")")){
                tree.append(",("+lTree.get(0));
            }else{
                tree.append("("+lTree.get(0));
            }

        }
        if(rTree.size()==1){
            tree.append(","+rTree.get(0)+")");
        }
        List<Integer> baseTree = new ArrayList<>();
        baseTree.addAll(rTree);
        if(lTree.size()>1){
            mTree.clear();
            mTree.addAll(lTree);
            getRoot(hTree,mTree,root,lTree,rTree,tree);
        }
        if(baseTree.size()>1){
            mTree.clear();
            mTree.addAll(baseTree);
            getRoot(hTree,mTree,root,lTree,rTree,tree);
        }
    }

    /**
     * 补全字符串
     * @param tree
     */
    public static void getString(StringBuilder tree){
        String str = tree.toString();
        int j = str.split("\\(").length-str.split("\\)").length;
        for(int i = 0;i<j;i++){
            tree.append(")");
        }
    }

上一篇:可持久化线段树学习笔记


下一篇:阿里云消息队列 RocketMQ 5.0 全新升级:消息、事件、流融合处理平台