删除二叉查找树的节点
给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你应该保证处理之后的树仍是二叉查找树。
您在真实的面试中是否遇到过这个题?
Yes
样例
给出如下二叉查找树:
5
/ \
3 6
/ \
2 4
删除节点3之后,你可以返回:
5
/ \
2 6
\
4
或者:
5
/ \
4 6
/
2
- 递归找到需要删除的节点findNode
- 递归找到需要删除的节点的父节点preFindNode
- 删除findNode节点
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /** * @param root: The root of the binary search tree. * @param value: Remove the node with given value. * @return: The root of the binary search tree after removal. */ public static TreeNode removeNode(TreeNode root, int value) { // write your code here if (root == null) { return null; } if (root.val == value && root.left == null && root.right == null) { return null; } else if (root.val == value) { if (root.left != null) { root.left.right = root.right; return root.left; } else { return root.right; } } TreeNode findNode = findNode(root, value); if (findNode != null) { TreeNode preFindNode = findPreNode(root, findNode.val); if (preFindNode.val > findNode.val) { // 在左子树上找到 if (findNode.left == null && findNode.right == null) { preFindNode.left = null; } if (findNode.left == null && findNode.right != null) { preFindNode.left = findNode.right; } if (findNode.left != null && findNode.right == null) { preFindNode.left = findNode.left; } if (findNode.left != null && findNode.right != null) { preFindNode.left = findNode.left; preFindNode.left.right = findNode.right; } } else { // 在右子树上找到 if (findNode.left == null && findNode.right == null) { preFindNode.right = null; } if (findNode.left == null && findNode.right != null) { preFindNode.right = findNode.right; } if (findNode.left != null && findNode.right == null) { preFindNode.right = findNode.left; } if (findNode.left != null && findNode.right != null) { preFindNode.right = findNode.left; preFindNode.left.right = findNode.right; } } } return root; } public static TreeNode findNode(TreeNode root, int value) { if (root == null) { return null; } if (root.val == value) { return root; } if (root.val > value) { return findNode(root.left, value); } if (root.val < value) { return findNode(root.right, value); } return null; } public static TreeNode findPreNode(TreeNode root, int value) { if (root == null) { return null; } if (root.left != null && root.left.val == value) { return root; } if (root.right != null && root.right.val == value) { return root; } if (root.val > value) { return findPreNode(root.left, value); } if (root.val < value) { return findPreNode(root.right, value); } return null; } }