一、由中序和后序遍历序列构造二叉树
106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
Map<Integer, Integer> map;//方便后续查找node位置
public TreeNode buildTree(int[] inorder, int[] postorder) {
map=new HashMap<>();
for (int i=0;i<inorder.length;i++) {
map.put(inorder[i],i);//将中序遍历序列保存在map中
}
return findNode(inorder,0,inorder.length,postorder,0,postorder.length);
}
public TreeNode findNode(int[] inorder,int ibegin,int iend,int[] postorder,int pbegin,int pend) {
if(ibegin>=iend||pbegin>=pend)return null;//区间不满足左闭右开
int rootindex=map.get(postorder[pend-1]);//得到后序遍历序列最后一个元素在中序遍历序列的位置
TreeNode node=new TreeNode(inorder[rootindex]);//构造节点
int leftsize=rootindex-ibegin;//左中序长度
node.left=findNode(inorder,ibegin,rootindex,postorder,pbegin,pbegin+leftsize);
node.right=findNode(inorder,rootindex+1,iend,postorder,pbegin+leftsize,pend-1);
return node;
}
}
二、由前序和中序遍历序列构造二叉树
105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)
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 ibegin,int iend,int[] preorder,int pbegin,int pend) {
if(ibegin>=iend||pbegin>=pend)return null;
int rootIndex=map.get(preorder[pbegin]);
TreeNode node=new TreeNode(inorder[rootIndex]);
int leftsize=rootIndex-ibegin;
node.left=findNode(inorder,ibegin,rootIndex,preorder,pbegin+1,pbegin+leftsize+1);
node.right=findNode(inorder,rootIndex+1,iend,preorder,pbegin+leftsize+1,pend);
return node;
}
}