ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-02-09 20:04:04  阅读:183  来源: 互联网

标签:遍历 java 树结构 mTree rTree tree mt lTree List


     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(")");
        }
    }

标签:遍历,java,树结构,mTree,rTree,tree,mt,lTree,List
来源: https://blog.csdn.net/qq_49721447/article/details/122843798

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有