105. 从前序与中序遍历序列构造二叉树
递归:
java
/**
* 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> hashmap;
//中左右 左中右
public TreeNode buildTree(int[] preorder, int[] inorder) {
hashmap = new HashMap<>();
int n = preorder.length;
for(int i = 0; i<n;i++){
hashmap.put(inorder[i],i);
}
return buildMyTree(preorder,inorder,0,n-1,0,n-1);
}
private TreeNode buildMyTree(int[] preorder,int[] inorder,int pl,int pr, int il,int ir){
if(pl>pr){
return null;
}
int rootVal = preorder[pl];
TreeNode root = new TreeNode(rootVal);
int index = hashmap.get(rootVal);
int leftTreeLen = index - il;
root.left = buildMyTree(preorder,inorder,pl+1,pl+leftTreeLen,il,index-1);
root.right = buildMyTree(preorder,inorder,pl+leftTreeLen+1,pr,index+1,ir);
return root;
}
}
时间复杂度:O(N)
空间复杂度:O(N)
236. 二叉树的最近公共祖先
递归:
java
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root == null || root == p || root == q){
return root;
}
TreeNode left = lowestCommonAncestor(root.left,p,q);
TreeNode right = lowestCommonAncestor(root.right,p,q);
if(left != null && right != null){
return root;
}
return left!=null?left:right;
}
}
时间复杂度:O(N)
空间复杂度:O(N)