I understand pre-order, in-order, and post-order tree traversal algorithms just fine. (Reference). I understand a few uses: in-order for traversing binary search trees in order, pre-order for cloning a tree. But I can't for the life of me come up with a real world task that I'd need post-order traversal to accomplish.
Can you give me an example? And: can you give me any better uses for pre-order traversal?
Edit: Can anyone give me an example other than expression trees and RPN? Is that really all post-order is good for?
Preorder traversal It means that, first root node is visited after that the left subtree is traversed recursively, and finally, right subtree is recursively traversed. As the root node is traversed before (or pre) the left and right subtree, it is called preorder traversal.
Preorder traversal is used to create a copy of the tree. Preorder traversal is also used to get prefix expression on an expression tree.
Pre-order traversal is useful when we're searching for an element within a binary search tree. We can use the root nodes value to determine if we need to search the right or left subtree next.
Each node is freed after freeing its children. In-order traversal is very commonly used on binary search trees because it returns values from the underlying set in order, according to the comparator that set up the binary search tree.
Topological sorting is a post-order traversal of trees (or directed acyclic graphs).
The idea is that the nodes of the graph represent tasks and an edge from A
to B
indicates that A
has to be performed before B
. A topological sort will arrange these tasks in a sequence such that all the dependencies of a task appear earlier than the task itself. Any build system like UNIX make has to implement this algorithm.
The example that Dario mentioned — destroying all nodes of a tree with manual memory management — is an instance of this problem. After all, the task of destroying a node depends on the destruction of its children.
As Henk Holterman pointed out, destroying a tree using manual memory management usually is a post-order traversal.
Pseudocode:
destroy(node) {
if (node == null) return;
destroy(node.left)
destroy(node.right)
// Post-order freeing of current node
free(node)
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With