算法记录
LeetCode 题目:
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
说明
一、题目
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
二、分析
- 按照调转前驱或者是后继的方式进行删除,分清楚三个出度的判断情况,其中的零个或一个可以进行一次合并。
class Solution {
public TreeNode getPrevious(TreeNode root) {
TreeNode temp = root.left;
while(temp.right != null) temp = temp.right;
return temp;
}
public TreeNode getNext(TreeNode root) {
TreeNode temp = root.right;
while(temp.left != null) temp = temp.left;
return temp;
}
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null) return null;
if(root.val > key) {
root.left = deleteNode(root.left, key);
} else if(root.val < key) {
root.right = deleteNode(root.right, key);
} else {
if(root.left == null || root.right == null) {
TreeNode temp = root.left == null ? root.right : root.left;
return temp;
} else {
TreeNode temp = getNext(root);
root.val = temp.val;
root.right = deleteNode(root.right, temp.val);
}
}
return root;
}
}
总结
熟悉二叉搜索的性质删除特性。