当前位置 博文首页 > 是琳琳呀!的博客:根据前序遍历与中序遍历,中序遍历与后序遍历
思路:用前序或者后序遍历找根,用中序遍历确定左右树。1.找到根2:在中序遍历当中找到根的位置,此时根的左边是作数右边是右树。
1.根据一棵树的前序遍历与中序遍历构造二叉树。
class Solution {
public int preIndex=0;
public TreeNode buildTreeChild(int[] preorder, int[] inorder,int inbegin,int inend) {
if(inbegin>inend){
return null;
}
TreeNode root=new TreeNode(preorder[preIndex]);
//找到中序遍历数组对应的下标,来确定左右树
int index=find(inorder,preorder[preIndex],inbegin,inend);
preIndex++;
root.left=buildTreeChild(preorder,inorder,inbegin,index-1);
root.right=buildTreeChild(preorder,inorder,index+1,inend);
return root;
}
public int find(int[] inorder,int key,int inbegin,int inend){
for(int i=inbegin;i<=inend;i++){
if(inorder[i]==key){
return i;
}
}
return -1;
}
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder==null||inorder==null){
return null;
}
if(preorder.length==0||inorder.length==0){
return null;
}
return buildTreeChild(preorder,inorder,0,inorder.length-1);
}
}
2.根据一棵树的中序遍历与后序遍历构造二叉树。
class Solution {
public int preIndex=0;
public TreeNode buildTreeChild(int[] postorder,int[] inorder,int inbegin,int inend){
if(inbegin>inend){
return null;
}
TreeNode root=new TreeNode(postorder[preIndex]);
int index=findValInorder(inorder,postorder[preIndex],inbegin,inend);
preIndex--;
root.right=buildTreeChild(postorder,inorder,index+1,inend);
root.left=buildTreeChild(postorder,inorder,inbegin,index-1);
return root;
}
public int findValInorder(int[] inorder,int key,int inbegin,int inend) {
for(int i = inbegin;i <= inend; i++) {
if(inorder[i] == key) {
return i;
}
}
return -1;
}
public TreeNode buildTree(int[] inorder, int[] postorder) {
if(postorder == null || inorder == null) return null;
if(postorder.length == 0|| inorder.length == 0) return null;
preIndex = postorder.length-1;
return buildTreeChild(postorder,inorder,0,inorder.length-1);
}
}
cs