提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、二叉树的建立(C语言)
二叉树的节点的结构体创建
typedef struct node
{
int date; //数据
struct node *left; //左子树
struct node *right; //右子树
}Node;
在函数中声明节点,并赋予节点数据
Node n1;
Node n2;
Node n3;
Node n4;
Node n5;
Node n6;
n1.date = 1;
n2.date = 2;
n3.date = 3;
n4.date = 4;
n5.date = 5;
n6.date = 6;
建立节点的连接
n1.left = n2;
n1.right = &n3; //要取地址
n2.left = &n4;
n2.right = &n5;
n3.left = NULL;
n3.right = &n6;
n4.left = NULL;
n4.right = NULL;
n5.left = NULL;
n5.right = NULL;
n6.left = NULL;
n6.right = NULL;
全部代码
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int date; //数据
struct node *left; //左孩子
struct node *right; //右孩子
}Node;
int main()
{
Node n1;
Node n2;
Node n3;
Node n4;
Node n5;
Node n6;
n1.date = 1;
n2.date = 2;
n3.date = 3;
n4.date = 4;
n5.date = 5;
n6.date = 6;
n1.left = &n2; //要取地址
n1.right = &n3;
n2.left = &n4;
n2.right = &n5;
n3.left = NULL;
n3.right = &n6;
n4.left = NULL;
n4.right = NULL;
n5.left = NULL;
n5.right = NULL;
n6.left = NULL;
n6.right = NULL;
return 0;
}
二、前序遍历
1.前序遍历的方式
根节点 —— 左子树 —— 右子树
比如上面是二叉树的前序遍历的顺序为:1-2-4-5-3-6。
2.代码实现
代码如下(示例):
void preorder(Node *node) //遍历使用递归
{
if(node != NULL){
printf("%d\n",node -> date); //输出数据
preorder(node -> left); //左子树
preorder(node -> right); //右子树
} else return; //设定递归结束条件
}
preorder(&n1); //前序遍历 从根节点开始
运行结果为:
三、中序遍历
1.中序遍历的实现方式
左子树 —— 根节点 —— 右子树
比如上面是二叉树的前序遍历的顺序为:4-2-5-1-3-6。
2.代码实现
代码如下(示例):
void inorder(Node *node)// 中序遍历 左——根——右
{
if(node != NULL){
inorder(node -> left); //左子树
printf("%d",node -> date); //输出数据
inorder(node -> right); //右子树
}
}
inorder(&n1); //中序遍历 从根节点开始
运行结果为:
四、后序遍历
1.后序遍历的实现方式
左子树 —— 右子树 —— 根节点
比如上面是二叉树的前序遍历的顺序为:4-5-2-6-3-1。
2.代码实现
代码如下(示例):
void postorder(Node *node)// 后序遍历 左——右——根
{
if(node != NULL){
postorder(node -> left); //左子树
postorder(node -> right); //右子树
printf("%d",node -> date); //输出数据
}
}
postorder(&n1); //后序遍历 从根节点开始
运行结果为:
完整代码
#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",node -> date); //输出数据
preorder(node -> left); //左子树
preorder(node -> right); //右子树
}else return; //设定递归结束条件
}
void inorder(Node *node)// 中序遍历 左——根——右
{
if(node != NULL){
inorder(node -> left); //左子树
printf("%d",node -> date); //输出数据
inorder(node -> right); //右子树
}
}
void postorder(Node *node)// 后序遍历 左——右——根
{
if(node != NULL){
postorder(node -> left); //左子树
postorder(node -> right); //右子树
printf("%d",node -> date); //输出数据
}
}
int main()
{
Node n1;
Node n2;
Node n3;
Node n4;
Node n5;
Node n6;
n1.date = 1;
n2.date = 2;
n3.date = 3;
n4.date = 4;
n5.date = 5;
n6.date = 6;
n1.left = &n2; //要取地址
n1.right = &n3;
n2.left = &n4;
n2.right = &n5;
n3.left = NULL;
n3.right = &n6;
n4.left = NULL;
n4.right = NULL;
n5.left = NULL;
n5.right = NULL;
n6.left = NULL;
n6.right = NULL;
preorder(&n1); //前序遍历 从根节点开始
printf("\n");
inorder(&n1);
printf("\n");
postorder(&n1);
printf("\n");
return 0;
}