LeetCode:235. 二叉搜索树的最近公共祖先
解决方案:
1.思路
对于当前节点x,如果x比p和q的值都大,说明,p和q在x的右子树里面,那么去x的右子树里面去寻找; 对于当前节点x,如果x比p和q的值都小,说明,p和q在x的左子树里面,那么去x的左子树里面去寻找;
2.代码实现
class Solution {
public TreeNode lowestCommonAncestor ( TreeNode root, TreeNode p, TreeNode q) {
TreeNode ancestor = root;
while ( true ) {
if ( p. val < ancestor. val && q. val < ancestor. val) {
ancestor = ancestor. left;
} else if ( p. val > ancestor. val && q. val > ancestor. val) {
ancestor = ancestor. right;
} else {
break ;
}
}
return ancestor;
}
}
class Solution {
public TreeNode lowestCommonAncestor ( TreeNode root, TreeNode p, TreeNode q) {
if ( root. val> p. val && root. val> q. val) {
return lowestCommonAncestor ( root. left, p, q) ;
}
if ( root. val< q. val && root. val< p. val) {
return lowestCommonAncestor ( root. right, p, q) ;
}
else { return root; }
}
}
3.复杂度分析
非递归 时间复杂度为
O
(
n
)
O(n)
O ( n ) ; 空间复杂度为
O
(
1
)
O(1)
O ( 1 ) ; 递归 时间复杂度为
O
(
n
)
O(n)
O ( n ) ; 空间复杂度为
O
(
n
)
O(n)
O ( n ) ;
5.疑问
问:该题有必要使用递归吗? 答:没有必要,浪费空间复杂度;
LeetCode:701.二叉搜索树中的插入操作
解决方案:
1.思路:
2.代码实现
class Solution {
public TreeNode insertIntoBST ( TreeNode root, int val) {
if ( root == null ) {
return new TreeNode ( val) ;
}
TreeNode pos = root;
while ( pos != null ) {
if ( val < pos. val) {
if ( pos. left == null ) {
pos. left = new TreeNode ( val) ;
break ;
} else {
pos = pos. left;
}
} else {
if ( pos. right == null ) {
pos. right = new TreeNode ( val) ;
break ;
} else {
pos = pos. right;
}
}
}
return root;
}
}
3.复杂度分析
时间复杂度为
O
(
n
)
O(n)
O ( n ) ; 空间复杂度为
O
(
1
)
O(1)
O ( 1 ) ;
LeetCode:450.删除二叉搜索树中的节点
问题描述
解决方案:
1.思路:
2.代码实现
class Solution {
public TreeNode deleteNode ( TreeNode root, int key) {
if ( root == null ) {
return null ;
}
if ( root. val > key) {
root. left = deleteNode ( root. left, key) ;
return root;
}
if ( root. val < key) {
root. right = deleteNode ( root. right, key) ;
return root;
}
if ( root. val == key) {
if ( root. left == null && root. right == null ) {
return null ;
}
if ( root. right == null ) {
return root. left;
}
if ( root. left == null ) {
return root. right;
}
TreeNode successor = root. right;
while ( successor. left != null ) {
successor = successor. left;
}
root. right = deleteNode ( root. right, successor. val) ;
successor. right = root. right;
successor. left = root. left;
return successor;
}
return root;
}
}
3.复杂度分析