235. 二叉搜索树的最近公共祖先
思路
前序遍历从上往下找,因为二叉搜索树,所以公共祖先肯定是在[p,q]之间的。如果当前的节点比pq都大,那就往左找;都小往右,如果都不满足,说明就是在pq之间,返回当前节点
代码
/**
* 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.val>p.val && root.val>q.val) return lowestCommonAncestor(root.left,p,q);
if(root.val<p.val && root.val<q.val) return lowestCommonAncestor(root.right,p,q);
return root;
}
}
701.二叉搜索树中的插入操作
思路
二叉搜索树有顺序,前序遍历从上往下找
代码
/**
* 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 {
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root==null){
TreeNode node=new TreeNode(val);
return node;
}
insert(root,val);
return root;
}
public void insert(TreeNode root,int val){
if(root.val>val){
if(root.left==null){
TreeNode node=new TreeNode(val);
root.left=node;
return;
}
insertIntoBST(root.left,val);
}
if(root.val<val){
if(root.right==null){
TreeNode node=new TreeNode(val);
root.right=node;
return;
}
insertIntoBST(root.right,val);
}
}
}
450.删除二叉搜索树中的节点
思路
如果要删的是叶子节点,返回null就行;如果左有右空,返回左,如果左空右有,返回右;如果左右都不为空,要将左子树嫁接到右子树的最右下角的叶子节点(右边的每个都比左边大,右边最小的就是最左下角的)
代码
/**
* 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 {
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null) return root;
if(root.val==key){
if(root.left==null && root.right==null) return null;
if(root.left!=null && root.right==null) return root.left;
if(root.left==null && root.right!=null) return root.right;
TreeNode tempLeft=root.left;
TreeNode findRightRoot=root.right;
while(findRightRoot.left!=null){
findRightRoot=findRightRoot.left;
}
findRightRoot.left=tempLeft;
return root.right;
}
if(root.val>key) root.left=deleteNode(root.left,key);
if(root.val<key) root.right=deleteNode(root.right,key);
return root;
}
}