二叉树,顾名思义就是有两个叉的树,每个叉又可以在长出两个或一个叉,哈哈哈。
大致这个样子:左边的叫左子树,右边的叫右子树
二叉树的五种形态:
二叉树的遍历:前序(先序),中序,后序,层次遍历。
我们就拿这个二叉树举例:
前序遍历:根左右的方式,三个三个节点得看比较好遍历
ABC——ABDEC——ABDEGC——ABDEGCF——ABDEGCFH
中序遍历:左根右的方式,还是三三
BAC——DBAC——DBEAC——DBGEAC——DBGEACHF
后序遍历:左右根的方式,三三
BCA——DBCA——DEBCA——DEGBCA——DEGBHFCA
根据中序遍历和其他两种遍历方式可以推出这个二叉树的!
层次遍历:就是一层一层得遍历,
A——ABC——ABCDEF——ABCDEFGH
代码描述:
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef struct Node
{
int Num; //数据
struct Node* LChild;//左子树指针
struct Node* RChild;//右子树指针
}TREE,*LPTREE;
LPTREE CreateNode(int Num)
{
LPTREE newNode = (LPTREE)malloc(sizeof(TREE));
assert(newNode);
newNode->Num = Num;
newNode->LChild = NULL;
newNode->RChild = NULL;
return newNode;
}
//插入节点:父节点,左子树节点,右子树节点
void InsertNode(LPTREE parent, LPTREE LChild, LPTREE RChild)
{
parent->LChild = LChild;
parent->RChild = RChild;
}
//递归方式输出
//前序遍历,根左右
void PreOrder(LPTREE root)
{
if (root!= NULL)
{
printf("%d\t", root->Num);
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
//中序,左根右
void MidOrder(LPTREE root)
{
if (root != NULL)
{
MidOrder(root->LChild);
printf("%d\t", root->Num);
MidOrder(root->RChild);
}
}
//后序,左右根
void LastOrder(LPTREE root)
{
if (root != NULL)
{
LastOrder(root->LChild);
LastOrder(root->RChild);
printf("%d\t", root->Num);
}
}
//非递归方式遍历,层次遍历
void LayerOrder(LPTREE root)
{
LPTREE pmove = root;
LPTREE queue[1024];//创建一个队列
int front = 0;
int tail = 0;
queue[tail++] = pmove;//第一个节点入队
printf("%d\t", root->Num);
while (front != tail) {//出队
pmove = queue[front++];
//然后让左右子树入队
if (pmove->LChild!= NULL) {
queue[tail++] = pmove->LChild;
printf("%d\t", pmove->LChild->Num);
}
else if (pmove->RChild != NULL) {
queue[tail++] = pmove->RChild;
printf("%d\t", pmove->RChild->Num);
}
}
}
int main()
{
LPTREE A = CreateNode(1);
LPTREE B = CreateNode(2);
LPTREE C = CreateNode(3);
LPTREE D = CreateNode(4);
LPTREE E = CreateNode(5);
InsertNode(A, B, C);
InsertNode(B, D, NULL);
InsertNode(C, NULL, E);
PreOrder(A);
MidOrder(A);
LastOrder(A);
return 0;
}
还有非递归方式的遍历,这种就先不写了;