IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 二叉树的建立与前中后序的遍历 -> 正文阅读

[数据结构与算法]二叉树的建立与前中后序的遍历

作者:recommend-item-box type_download clearfix

目录

一.代码程序:

二.分块解析:

三.代码结果:



一.代码程序:

首先我们看下代码

#include <stdio.h>
#include <stdlib.h>

typedef int TElemtype;

typedef struct BiNode
{
	TElemtype data;//数据域
	struct BiNode * rchild ; // 指向右孩子的指针
	struct BiNode * lchild ; //指向左孩子的指针

}BiNode;

BiNode * Insert(BiNode *root,BiNode *p)
{
	if(root == NULL)
	{
		return p;
	}
	if(p == NULL)
	{
		return root;
	}
	//1 查找位置 
	BiNode *pf = root ;//遍历树
	BiNode *pk = NULL;//pk指向查找路径上的最后一个节点
	while(pf)
	{
		if(p->data < pf->data)
		{
			pk=pf;
			pf=pf->lchild;
		}
		else if(p->data > pf->data)
		{
			pk=pf;
			pf=pf->rchild;
		}
		else
			return root;
	}

	if(p->data < pk->data)
		pk->lchild=p;
	else if(p->data > pk->data)
		pk->rchild=p;
	
	return root;
}
void pre_order(BiNode *t)
{
	if(t!= NULL)
	{
		printf("%d ",t->data);
		pre_order(t->lchild);
		pre_order(t->rchild);
	}
}

void mid_order(BiNode *t)
{
	if(t!= NULL)
	{
		mid_order(t->lchild);
		printf("%d ",t->data);
		mid_order(t->rchild);
	}
}

void post_order(BiNode *t)
{
	if(t!= NULL)
	{
		post_order(t->lchild);
		post_order(t->rchild);
		printf("%d ",t->data);
	}
}


int main()
{
	BiNode * root =NULL;
	int d;
	while(1)
	{
		scanf("%d",&d);
		if(d==-1)
		{
			break;
		}
		BiNode *p =malloc(sizeof(*p));
		p->data =d;
		p->rchild =NULL;
		p->lchild =NULL;
		root=Insert(root,p);
	}
	//遍历树 
	printf("前序:");
	pre_order(root);
	printf("\n");

	printf("中序:");
	mid_order(root);
	printf("\n");

	printf("后序:");
	post_order(root);
	printf("\n");

	return 0;
}

二.分块解析:

(1)建立结点:

BiNode * root =NULL;
int d;
while(1)
{
	scanf("%d",&d);
	if(d==-1)
	{
		break;
	}
	BiNode *p =malloc(sizeof(*p));
	p->data =d;
	p->rchild =NULL;
	p->lchild =NULL;
	root=Insert(root,p);
}

结点的结构体变量:

typedef struct BiNode
{
	TElemtype data;//数据域
	struct BiNode * rchild ; // 指向右孩子的指针
	struct BiNode * lchild ; //指向左孩子的指针

}BiNode;

其中建立结点代码段中的?root=Insert(root,p)?是通过函数调用以及循环语句来把第一个输入的结点作为根结点,再通过之后的比较,来使后面的结点分配位置(左小右大)。

连接代码如下:

BiNode * Insert(BiNode *root,BiNode *p)
{
	if(root == NULL)
	{
		return p;
	}
	if(p == NULL)
	{
		return root;
	}
	//1 查找位置 
	BiNode *pf = root ;//遍历树
	BiNode *pk = NULL;//pk指向查找路径上的最后一个节点
	while(pf)
	{
		if(p->data < pf->data)
		{
			pk=pf;
			pf=pf->lchild;
		}
		else if(p->data > pf->data)
		{
			pk=pf;
			pf=pf->rchild;
		}
		else
			return root;
	}

	if(p->data < pk->data)
		pk->lchild=p;
	else if(p->data > pk->data)
		pk->rchild=p;
	
	return root;
}

其中先定义两个指针,一个用来遍历树,第二个用来存比完大小最后的结点的位置。

BiNode *pf = root ;

BiNode *pk = NULL;

?然后通过这两个指针来进行结点的插入。代码如下:

while(pf)
{
	if(p->data < pf->data)
	{
		pk=pf;
		pf=pf->lchild;
	}
	else if(p->data > pf->data)
	{
		pk=pf;
		pf=pf->rchild;
	}
	else
		return root;
}

if(p->data < pk->data)
	pk->lchild=p;
else if(p->data > pk->data)
	pk->rchild=p;
	
return root;

首先通过while循环找到插入位置,再通过比较大小,看插左还是右。

(3)遍历输出:

void pre_order(BiNode *t)
{
	if(t!= NULL)
	{
		printf("%d ",t->data);
		pre_order(t->lchild);
		pre_order(t->rchild);
	}
}

void mid_order(BiNode *t)
{
	if(t!= NULL)
	{
		mid_order(t->lchild);
		printf("%d ",t->data);
		mid_order(t->rchild);
	}
}

void post_order(BiNode *t)
{
	if(t!= NULL)
	{
		post_order(t->lchild);
		post_order(t->rchild);
		printf("%d ",t->data);
	}
}

通过递归的方法实现。

三.代码结果:

最后希望各位能从中学习到一些知识。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-27 12:07:09  更:2021-08-27 12:09:47 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 22:45:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码