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
总结
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)