其实二叉树的遍历最重要的一点就是递归!!!
前序遍历(递归)
二叉树的前序遍历,也就是先序遍历,先遍历根节点,然后遍历左子树,接着是右子树。不断的递归。
比如下面这棵树:
它的先序遍历就是1,2,4,5,3,6,7
代码如下:
void Preorder(BNode *root)
{
if (root == NULL)
{
return;
}
printf("%d ", root->data);
Preorder(root->left);
Preorder(root->right);
}
前序遍历(非递归)
void preorderLoop(BNode *root)
{
Stack stack;
StackInit(&stack);
BNode *node = root;
BNode *top;
while(node!=NULL||!StackEmpty(&stack))
{
while (node != NULL)
{
printf("%d", node->data);
StackPush(&stack, node);
node = node->left;
}
top = StackTop(&stack);
StackPop(&stack);
node = top->right;
}
}
中序遍历(递归)
中序遍历就是先遍历左子树,再遍历根,最后遍历右子树.
代码如下:
void Inorder(BNode *root)
{
if (root == NULL)
{
return;
}
Inorder(root->left);
printf("%d ", root->data);
Inorder(root->right);
}
中序遍历(非递归)
void inorderLoop(BNode *root)
{
Stack stack;
StackInit(&stack);
BNode *node = root;
BNode *top;
while (node != NULL || !StackEmpty(&stack))
{
while (node != NULL)
{
StackPush(&stack, node);
node = node->left;
}
top = StackTop(&stack);
StackPop(&stack);
printf("%d", top->data);
node = top->right;
}
}
后序遍历(递归)
后序遍历就是先遍历左子树,再遍历右子树,最后遍历根。
代码如下:
void Postorder(BNode *root)
{
if (root == NULL)
{
return;
}
Postorder(root->left);
Postorder(root->right);
printf("%d ", root->data);
}
后序遍历(非递归)
void postorderLoop(BNode *root)
{
Stack stack;
StackInit(&stack);
BNode *node = root;
BNode *top;
BNode *last = NULL;
while (node != NULL || !StackEmpty(&stack))
{
while (node != NULL)
{
StackPush(&stack, node);
node = node->left;
}
top = StackTop(&stack);
if (top ->right==NULL||top->right==last)
{
printf("%d", top->data);
last = top;
StackPop(&stack);
}
else {
node = top->right;
}
}
}