Skip to content

Commit a0abfbc

Browse files
committed
Chapter 05 BST predecessor and successor algo optimized.
1 parent 224f13f commit a0abfbc

File tree

2 files changed

+21
-28
lines changed
  • 05-Binary-Search-Tree
    • Course Code (C++)/Optional-03-Predecessor-and-Successor
    • Course Code (Java)/Optional-03-Predecessor-and-Successor/src/bobo/algo

2 files changed

+21
-28
lines changed

05-Binary-Search-Tree/Course Code (C++)/Optional-03-Predecessor-and-Successor/main.cpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -440,21 +440,19 @@ class BST{
440440
if(node->key == key)
441441
return NULL;
442442

443-
Node* maxNode;
444443
if(key < node->key)
445444
// 如果当前节点大于key, 则当前节点不可能是比key小的最大值
446445
// 向下搜索到的结果直接返回
447446
return predecessorFromAncestor(node->left, key);
448447
else{
449448
assert(key > node->key);
450449
// 如果当前节点小于key, 则当前节点有可能是比key小的最大值
451-
// 向下搜索结果存储到maxNode中
452-
maxNode = predecessorFromAncestor(node->right, key);
453-
if(maxNode)
454-
// maxNode和当前节点node取最大值返回
455-
return maxNode->key > node->key ? maxNode : node;
450+
// 向右继续搜索, 将结果存储到tempNode中
451+
Node* tempNode = predecessorFromAncestor(node->right, key);
452+
if(tempNode)
453+
return tempNode;
456454
else
457-
// 如果maxNode为空, 则当前节点即为结果
455+
// 如果tempNode为空, 则当前节点即为结果
458456
return node;
459457
}
460458
}
@@ -466,26 +464,25 @@ class BST{
466464
if(node->key == key)
467465
return NULL;
468466

469-
Node* minNode;
470467
if(key > node->key)
471468
// 如果当前节点小于key, 则当前节点不可能是比key大的最小值
472469
// 向下搜索到的结果直接返回
473470
return successorFromAncestor(node->right, key);
474471
else{
475472
assert(key < node->key);
476473
// 如果当前节点大于key, 则当前节点有可能是比key大的最小值
477-
// 向下搜索结果存储到minNode中
478-
minNode = predecessorFromAncestor(node->left, key);
479-
if(minNode)
480-
// minNode和当前节点node取最小值返回
481-
return minNode->key < node->key ? minNode : node;
474+
// 向左继续搜索, 将结果存储到tempNode中
475+
Node* tempNode = predecessorFromAncestor(node->left, key);
476+
if(tempNode)
477+
return tempNode;
482478
else
483-
// 如果minNode为空, 则当前节点即为结果
479+
// 如果tempNode为空, 则当前节点即为结果
484480
return node;
485481
}
486482
}
487483
};
488484

485+
489486
void shuffle( int arr[], int n ){
490487

491488
srand( time(NULL) );

05-Binary-Search-Tree/Course Code (Java)/Optional-03-Predecessor-and-Successor/src/bobo/algo/BST.java

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -423,21 +423,19 @@ Node predecessorFromAncestor(Node node, Key key){
423423
if(node.key.compareTo(key) == 0)
424424
return null;
425425

426-
Node maxNode;
427426
if(key.compareTo(node.key) < 0)
428427
// 如果当前节点大于key, 则当前节点不可能是比key小的最大值
429428
// 向下搜索到的结果直接返回
430429
return predecessorFromAncestor(node.left, key);
431430
else{
432431
assert key.compareTo(node.key) > 0;
433432
// 如果当前节点小于key, 则当前节点有可能是比key小的最大值
434-
// 向下搜索结果存储到maxNode中
435-
maxNode = predecessorFromAncestor(node.right, key);
436-
if(maxNode != null)
437-
// maxNode和当前节点node取最大值返回
438-
return maxNode.key.compareTo(node.key) > 0 ? maxNode : node;
433+
// 向右继续搜索, 将结果存储到tempNode中
434+
Node tempNode = predecessorFromAncestor(node.right, key);
435+
if(tempNode != null)
436+
return tempNode;
439437
else
440-
// 如果maxNode为空, 则当前节点即为结果
438+
// 如果tempNode为空, 则当前节点即为结果
441439
return node;
442440
}
443441
}
@@ -449,21 +447,19 @@ Node successorFromAncestor(Node node, Key key){
449447
if(node.key.compareTo(key) == 0)
450448
return null;
451449

452-
Node minNode;
453450
if(key.compareTo(node.key) > 0)
454451
// 如果当前节点小于key, 则当前节点不可能是比key大的最小值
455452
// 向下搜索到的结果直接返回
456453
return successorFromAncestor(node.right, key);
457454
else{
458455
assert(key.compareTo(node.key) < 0);
459456
// 如果当前节点大于key, 则当前节点有可能是比key大的最小值
460-
// 向下搜索结果存储到minNode中
461-
minNode = predecessorFromAncestor(node.left, key);
462-
if(minNode != null)
463-
// minNode和当前节点node取最小值返回
464-
return minNode.key.compareTo(node.key) < 0 ? minNode : node;
457+
// 向左继续搜索, 将结果存储到tempNode中
458+
Node tempNode = predecessorFromAncestor(node.left, key);
459+
if(tempNode != null)
460+
return tempNode;
465461
else
466-
// 如果minNode为空, 则当前节点即为结果
462+
// 如果tempNode为空, 则当前节点即为结果
467463
return node;
468464
}
469465
}

0 commit comments

Comments
 (0)