3 回答

TA贡献1793条经验 获得超6个赞
试试这个也许:
private BSTNode<E> getPrevNode(BSTNode<E> node) {
if(node.left != null) {
node = node.left;
while(node.right != null) {
node = node.right;
}
return node;
} else if(node.parent != null) {
// If the node is a right child, return its parent
if(node.parent.right == node) {
return node.parent;
}
// If the node is a left child, move up the tree
// until you are a right child and return its parent
if(node.parent.left == node) {
while(node.parent.right != node) {
// If you reach the root and are never a right child, no previous node return null
if(node.parent == root) {
return null;
}
node = node.parent;
}
return node.parent;
}
}
return null;
}

TA贡献1712条经验 获得超3个赞
利亚姆的回答到目前为止也是正确的,但是这是解决它的另一种方法。
private BSTNode<E> getPrevNode(BSTNode<E> node)
{
if(node.left != null)
{
node = node.left;
while(node.right != null)
{
node = node.right;
}
return node;
}
else if(node.parent != null)
{
if(node.parent.right == node)
{
return node.parent;
}
if(node.parent.left == node)
{
while(node.parent != null && node.parent.left == node)
{
node = node.parent;
}
if(node == root)
{
return null;
}
else
{
return node.parent;
}
}
}
return null;
}

TA贡献1757条经验 获得超7个赞
这是一个代码更少的解决方案。
private BSTNode<E> getPrevNode(BSTNode<E> node, int val) {
if (node == null) return null;
BSTNode<E> prev = null;
while (node != null) {
if (val < node.data) {
prev = node;
node = node.left;
} else if (val > node.data) {
prev = node;
node = node.right;
} else {
break;
}
}
return node != null ? prev : null;
}
添加回答
举报