1 从中序与后序遍历序列构造二叉树
题目
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
代码
class Solution {
Map<Integer,Integer> map;
public TreeNode buildTree(int[] inorder, int[] postorder) {
map=new HashMap<>();
for(int i=0;i<inorder.length;i++){
map.put(inorder[i],i);
}
return findNode(inorder,0,inorder.length,postorder,0,postorder.length);
}
public TreeNode findNode(int[] inorder,int inBegin,int inEnd,int[] postorder,int postBegin,int postEnd){
if(inBegin>=inEnd || postBegin>=postEnd) return null;
int rootIndex=map.get(postorder[postEnd-1]);
TreeNode root=new TreeNode(inorder[rootIndex]);
int len_left=rootIndex-inBegin;
root.left=findNode(inorder,inBegin,rootIndex,postorder,postBegin,postBegin+len_left);
root.right=findNode(inorder,rootIndex+1,inEnd,postorder,postBegin+len_left,postEnd-1);
return root;
}
}
总结
后序最后一个结点是根结点;
根据根节点,在中序序列中划分左右子树;
递归
2 从中序与前序遍历序列构造二叉树
题目
给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点
代码
class Solution {
Map<Integer,Integer> map;
public TreeNode buildTree(int[] preorder, int[] inorder) {
map=new HashMap<>();
for(int i=0;i<inorder.length;i++){
map.put(inorder[i],i);
}
return findNode(inorder,0,inorder.length,preorder,0,preorder.length);
}
public TreeNode findNode(int[] inorder,int inBegin,int inEnd,int[] preorder,int preBegin,int preEnd){
if(inBegin>=inEnd || preBegin>=preEnd) return null;
int rootIndex=map.get(preorder[preBegin]);
TreeNode root=new TreeNode(inorder[rootIndex]);
int len_left=rootIndex-inBegin;
root.left=findNode(inorder,inBegin,rootIndex,preorder,preBegin+1,preBegin+1+len_left);
root.right=findNode(inorder,rootIndex+1,inEnd,preorder,preBegin+len_left+1,preEnd);
return root;
}
}
总结
前序序列第一个结点是根节点,
在中序序列中找到根节点,分左右子树
递归
前序+后序 无法构成一个树。没有办法确定左右子树。