您的位置:首页 > Web前端 > Node.js

[刷题]Remove Node in Binary Search Tree

2015-03-31 22:29 405 查看
[LintCode]Remove Node in Binary Search Tree

/**
* 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.
*/
private TreeNode lastNode;
private TreeNode targetNode;

private boolean findNode(TreeNode root, int value) {
while (root != null) {
if (root.val < value) {
lastNode = root;
root = root.right;
} else if (root.val > value) {
lastNode = root;
root = root.left;
} else {
targetNode = root;
return true;// find it
}
}
return false;
}

private void deleteNode() {
if (targetNode.left != null && targetNode.right != null) {
if (lastNode.left == targetNode) {
lastNode.left = targetNode.left;
} else {
lastNode.right = targetNode.left;
}
TreeNode temp = targetNode.left;
while (temp.right != null) {
temp = temp.right;
}
temp.right = targetNode.right;
} else if (targetNode.left != null) {
if (lastNode.left == targetNode) {
lastNode.left = targetNode.left;
} else {
lastNode.right = targetNode.left;
}
} else if (targetNode.right != null) {
if (lastNode.left == targetNode) {
lastNode.left = targetNode.right;
} else {
lastNode.right = targetNode.right;
}
} else {
if (lastNode.left == targetNode) {
lastNode.left = null;
} else {
lastNode.right = null;
}
}
}

public TreeNode removeNode(TreeNode root, int value) {
// 2015-3-30
if (root == null) {
return root;
}
TreeNode dummy = new TreeNode(0);
dummy.left = root;
// do not find it and do nothing
if (!findNode(root, value)) {
return root;
}
if (lastNode == null) {
lastNode = dummy;
}
deleteNode();

return dummy.left;
}
}
// 遇到删除节点的题,一定要考虑,被删除的节点是不是根节点,使用dummyNode
// 使用lastNode时,一定要考虑会不会为空指针
// 待改进
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: