java算法:重建二叉树

问题

  • 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
    假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

解决

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {

        private Map<Integer,Integer> map;
       public TreeNode buildTree(int[] preorder, int[] inorder) {
           int n=preorder.length;
           //使用hashmap储存的时候,key-数的值,vlue对应位置
           map=new HashMap<Integer,Integer>();
           for(int i=0;i<n;i++){
                //这里因为是对中序遍历进行主要操作,所以应该储存中序遍历值和位置
                map.put(inorder[i],i);
           }
           return MyTree(preorder,inorder,0,n-1,0,n-1);
    }
     //该方法利用递归生成树,其中preorder_left代表前序遍历左子树的“左边界”,其他类比
    public  TreeNode MyTree(int[] preorder,int[] inorder,int preorder_left,int preorder_right,int inorder_left,int inorder_right){       
                if(preorder_left>preorder_right){       //以前序左结点位置大于右节点位置为结束条件?
                return null;
                }
               int preorder_root=preorder_left; //每个子树的最左边
               int inorder_root=map.get(preorder[preorder_root]);//首先以前序排列获得中序的root,每次都是以前序排列的子树的最左边一个就是中序的子树的根结点
                TreeNode root=new TreeNode(preorder[preorder_root]);//建立root
               int aomunt_left_subtree=inorder_root-inorder_left;//得到左孩子的结点数,中序遍历的根位置减去左子树的左边括号位置,得到右子树的根的起始位置
                root.left=MyTree(preorder,inorder,preorder_left+1,preorder_left+aomunt_left_subtree,inorder_left,inorder_root-1);//求左子树传入前序的左子树第一个,左子树最后一个,。。。      
                root.right=MyTree(preorder,inorder,preorder_left+aomunt_left_subtree+1,preorder_right,inorder_root+1,inorder_right);
                return root;//返回root

    }
}

//前序遍历:根左右()优先遍历根 ,中序遍历:左跟右(优先遍历左),如果有父节点要等这层排完才拍父节点,有孩子排该结点时,则先排孩子的,
//左孩子是2*i+1,右孩子是2*i+2

总结


posted @   new_monkey  阅读(113)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示