目录
105.从前序与中序遍历序列构造二叉树
题目
代码
106.从中序与后序遍历序列构造二叉树
题目
代码
105.从前序与中序遍历序列构造二叉树
题目
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 输出: [3,9,20,null,null,15,7]
代码(递归)
class Solution {public TreeNode buildTree(int[] preorder, int[] inorder) {if(preorder.length == 0 || inorder.length == 0){return null;}return build(inorder,0,inorder.length-1,preorder,0,preorder.length-1);}//左闭右闭public TreeNode build(int[] in,int in1,int in2,int[] pre,int pre1,int pre2){//终止条件if(pre1 > pre2 || in1 > in2){return null;}int rootval = pre[pre1]; //根节点是前序的第一个节点TreeNode root = new TreeNode(rootval); //创建根节点//获取前序的第一个节点在中序的索引int index = 0;for(int i=in1;i <= in2;i++){if(in[i] ==rootval){index = i;}}//切分中序区间int a1 = in1; //中序左边开始int a2 = index - 1; //中序左边结束int a3 = index + 1; //中序右边开始int a4 = in2; //中序右边结束//切分前序区间int b1 = pre1 + 1; //前序左边开始int b2 = b1 + (a2 - a1); //前序左边结束int b3 = b2 + 1; //前序右边开始int b4 = pre2; //前序右边结束root.left = build(in,a1,a2,pre,b1,b2);root.right = build(in,a3,a4,pre,b3,b4);return root;}
}
106.从中序与后序遍历序列构造二叉树
题目
给定两个整数数组 inorder
和 postorder
,其中 inorder
是二叉树的中序遍历, postorder
是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例 1:
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3] 输出:[3,9,20,null,null,15,7]
代码
class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {if(inorder.length == 0){return null;}return build(inorder,0,inorder.length-1,postorder,0,postorder.length-1);}//左闭右闭public TreeNode build(int[] in,int in1,int in2,int[] post,int post1,int post2){//终止逻辑if(post1 > post2 || in1 > in2){return null;}//单层逻辑int rootval = post[post2]; //根节点是post后序的最后一个节点TreeNode root = new TreeNode(rootval); //创建根节点int index = 0;//在中序in中找到rootval的下标for(int i=in1;i <= in2;i++){if(in[i] == rootval){index = i;break;}}//a是中序区间int a1 = in1; //中序左边的开始int a2 = index - 1; //中序左边的结束int a3 = index + 1; //中序右边的开始int a4 = in2; //中序右边的结束//b是后序区间int b1 = post1; //后序左边的开始int b2 = post1 + (a2 - a1); //后序左边的结束int b3 = b2 + 1; //后序右边的开始int b4 = post2 - 1; //后序右边的结束//递归左孩子root.left = build(in,a1,a2,post,b1,b2);//递归右孩子root.right = build(in,a3,a4,post,b3,b4);return root;}
}