问题
I am having some trouble understanding the recursive functions involved in preorder, inorder, and postorder tree traversal. I have some knowledge of recursion (but admittedly its not my strong suit). All of the seem to call themselves twice first making a call with the left child of the root and then with the right child. But how exactly is this possible? Wouldn't the call to the preOrder function with the left child return the flow of control back to the top, and the next call would never be executed?
void preOrder (Node* root)
{
if (root == NULL) return;
cout<<root->val<<", ";
preOrder(root->left);
preOrder(root->right);
}
回答1:
Wouldn't the call to the preOrder function with the left child return the flow of control back to the top, and the next call would never be executed?
Of course not. The recursive call works just like any other function call: after the function completion the control returns to the place of call. 'The place' means not only the point in the code but also the point on the call stack, which means the same set of variables is available again. Just like after returning from any other function.
For example if you have a tree
A
/ \
X Y
and you call preorder
on the A
node, then it first prints the A
contents, then calls preorder
on X
and on return it is back in preorder(A)
, so it proceeds to call preorder
on Y
.
回答2:
Preorder: Process the node, move to the left child, move to the right child
void preorder(Node *root)
{
if (root == NULL) //<- Check if the currently passed node is empty
return; //<- if it is, return from the function back down the stack
cout << root->val << ", "; //<- if it wasn't empty, print its value
if (root->left != NULL) //<- check if the node to the left is empty
preorder(root->left); //<- if not recurse to the left child
if (root->right != NULL) //<- check if the node to the right is empty
preorder(root->right); //<- if not recurse to the right child
}
Inorder: move to the left, process the node, move to the right
void inorder(Node *root)
{
if (root == NULL)
return;
if (root->left != NULL) //<- check if the node to the left is empty
inorder(root->left); //<- if not recurse to the left child
cout << root->val << ", ";
if (root->right != NULL) //<- check if the node to the right is empty
inorder(root->right); //<- if not recurse to the right child
}
Postorder: Move to the left node, move to the right node, process the node
void postorder(Node *root)
{
if (root == NULL)
return;
if (root->left != NULL) //<- check if the node to the left is empty
postorder(root->left); //<- if not recurse to the left child
if (root->right != NULL) //<- check if the node to the right is empty
postorder(root->right); //<- if not recurse to the right child
cout << root->val << ", "
}
回答3:
void preorder(node *p) {
if(p) {
cout << p->val <<"\n";
preorder(p->left);
preorder(p->right);
}
}
来源:https://stackoverflow.com/questions/33818795/having-trouble-understanding-tree-traversal-recursive-functions