如何删除Binarytree
中的最大Node。如果它的元素等于最大元素,我想删除整个Node;)我可以返回最大节点,但是如何删除它。不在BinarySearchTree中。
public class MyLinkedBinaryTree extends LinkedBinaryTree {
MyLinkedBinaryTree() {
super();
}
public void removeMax(BinaryTreeNode t, int i) {
if ((int) t.element != i && t.rightChild != null && t.leftChild != null) {
if (t.leftChild != null)
removeMax(t.leftChild, i);
if (t.rightChild != null)
removeMax(t.rightChild, i);
} else if ((int) root.element == i) {
root = null;
}
}
public int findMax(BinaryTreeNode t) {
if (t == null)
return 0;
int res = (int) t.element;
int lres = findMax(t.rightChild);
int rres = findMax(t.leftChild);
if (lres > res)
res = lres;
if (rres > res)
res = rres;
return res;
}
答案 0 :(得分:0)
您只想删除最大节点(并重新分支其子节点)还是删除该节点及其所有子节点?
此外,节点应有权访问其子节点,但不能访问其根节点。您需要重构代码,以便能够删除子级之一(如果它是您的目标)(如果您理解的话,如果我理解的话,拥有最大价值的节点)。
答案 1 :(得分:0)
执行此操作的一种方法是更改findMax
而不是返回值,而是返回包含该值的实际节点:
//DISCLAIMER: untested code
public BinaryTreeNode findMaxNode(BinaryTreeNode t) {
if (t == null)
return null;
BinaryTreeNode max = t;
BinaryTreeNode maxLeft = findMax(t.rightChild);
BinaryTreeNode maxRight = findMax(t.leftChild);
if (maxLeft!=null && maxLeft.element > t.element) {
max = maxLeft;
}
if (maxRight !=null && maxRight .element > t.element) {
max = maxRight ;
}
return max;
}
然后,您必须弄清楚如何从树中删除该节点。我假设它有一个指向其父节点的链接。然后我们可以将其从其父级中删除,从而将其从树中删除:
public void removeMax(BinaryTreeNode t) {
if(t==null) return;
BinaryTreeNode max = findMaxNode(t);
//removing a node from its parent
BinaryTreeNode parent = max.parent;
if(parent==null) {
//figure out what to do is the maximum value is at the root
} else if(parent.leftChild==max) {
parent.leftChild = null;
} else if(parent.rightChild==max) {
parent.rightChild = null;
}
}
您需要弄清楚当根数达到最大值并删除整个树时该怎么做。
如果您的节点没有对其父节点的引用,则必须更新findMaxNode
以返回最大节点的父节点。