前序遍历:先根节点,后左子树,最后右子树。
中序遍历:先左子树,后根节点,最后右子树。
后序遍历:先左子树,后右子树,最后根节点。
由上可以看出,无论哪种遍历方法左节点总是在右节点的前面,如何区分是前中后,主要看根节点位于哪个位置。
上面二叉树前序遍历:2 3 4 5 6 7 8
中序遍历;4 3 5 2 7 6 8
后序遍历:4 5 3 7 8 6 2
#include<stdio.h>
#include<stdlib.h>
struct treenode
{
int data;
treenode *left;
treenode *right;
};
treenode* createTree();//建立二叉树
void showTreeAhead(treenode *root);//前序遍历
void showTreeMiddle(treenode *root);//中序遍历
void showTreeAfter(treenode *root);//后序遍历
void rank(treenode *root);//堆排序
int main()
{
treenode *root;
root = createTree();
printf("二叉树建立完成\n");
printf("前序遍历\n");
showTreeAhead(root);
printf("\n中序遍历\n");
showTreeMiddle(root);
printf("\n后序遍历\n");
showTreeAfter(root);
system("pause");
}
/*
建立二叉树的时候。注意将叶子节点的下面左右节点赋值-1(也就是为NULL)
*/
treenode* createTree()
{
int d = 0;
treenode *root;
scanf_s("%d", &d);
if (d > 0)
{
root = (treenode*)malloc(sizeof(treenode));
root->data = d;
root->left = createTree();
root->right = createTree();
}
else
{
root = NULL;
}
return root;
}
void showTreeAhead(treenode *root)
{
if (root != NULL)
{
printf("%d ", root->data);
showTreeAhead(root->left);
showTreeAhead(root->right);
}
}
void showTreeMiddle(treenode *root)
{
if (root != NULL)
{
showTreeMiddle(root->left);
printf("%d ", root->data);
showTreeMiddle(root->right);
}
}
void showTreeAfter(treenode *root)
{
if (root != NULL)
{
showTreeAfter(root->left);
showTreeAfter(root->right);
printf("%d ", root->data);
}
}
void rank(treenode *root)
{
}