下面是一个迭代算法,可以在不使用 Stack的情况下按顺序(首先left child
,然后是parent
,最后)遍历二叉搜索树:right child
(想法:整个想法是找到一棵树的最左边的孩子,每次都找到手头节点的后继节点并打印它的值,直到没有剩下的节点为止。)
void In-Order-Traverse(Node root){
Min-Tree(root); //finding left-most child
Node current = root;
while (current != null){
print-on-screen(current.key);
current = Successor(current);
}
return;
}
Node Min-Tree(Node root){ // find the leftmost child
Node current = root;
while (current.leftChild != null)
current = current.leftChild;
return current;
}
Node Successor(Node root){
if (root.rightChild != null) // if root has a right child ,find the leftmost child of the right sub-tree
return Min-Tree(root.rightChild);
else{
current = root;
while (current.parent != null && current.parent.leftChild != current)
current = current.parent;
return current.parrent;
}
}
据称,该算法的时间复杂度是Theta(n)
假设 BST 中有n
节点,这肯定是正确的。但是我无法说服自己,因为我猜一些节点的遍历次数超过了常数,这取决于它们的子树中的节点数量,并且总结所有这些访问次数不会导致时间复杂度Theta(n)
关于如何证明它的任何想法或直觉?