#include<stdio.h>
#include<stdlib.h>
typedef struct node {
int date;
struct node* left;
struct node* right;
}Node;
//先序遍历
void preorder(Node* node) {
if (node != NULL) {
printf("%d\t", node->date);
preorder(node->left);
preorder(node->right);
}
}
//中序遍历
void inorder(Node* node) {
if (node != NULL) {
inorder(node->left);
printf("%d\t", node->date);
inorder(node->right);
}
}
//后序遍历
void postorder(Node* node) {
if (node != NULL) {
postorder(node->left);
postorder(node->right);
printf("%d\t", node->date);
}
}
int main()
{
Node n1;
Node n2;
Node n3;
Node n4;
n1.date = 5;
n2.date = 6;
n3.date = 7;
n4.date = 8;
n1.left = &n2;
n1.right = &n3;
n2.left = &n4;
n2.right = NULL;
n3.left = NULL;
n3.right = NULL;
n4.left = NULL;
n4.right = NULL;
preorder(&n1); //先序
putchar('\n');
inorder(&n1); //中序
putchar('\n');
postorder(&n1); //后序
就是递归的算法,
1.拿先序遍历来说,当把根节点传给函数之后,函数先判断该节点是否为空。
如果不为空,则打印该节点(第一次调用 i = 1)。
2.之后再该函数体中再调用该函数(第二次调用 i = 2),把该节点的左节点作为函数参数,然后该函数判断左节点是否为空,若不为空,打印该节点。
3.之后再调用该函数(第三次调用 i = 3),把这个结点的左节点作为该函数的参数,直到左节点为空,然后返回一层一层的返回函数,返回之后, 只剩根节点调用的那一层函数,
4.而后开始把根节点的右节点当作函数参数传给该函数。和把左节点当参数的步骤一样,
5.最后当右节点也全部为空之后,函数调用结束