树和二叉树(Tree&Binary Tree)

发布于:2023-01-06 ⋅ 阅读:(211) ⋅ 点赞:(0)

        树是一种非线性的数据结构,它在表示机构的组织关系图等方面非常好用,树的示意图如图1所示。

 图1 - 树的示意图

一、表达方式 

        树主要由自身的数据域和其父节点构成,所以表示方法可以利用一个结构体数据表示,其方法如下。

const int maxn=10;//10个节点
struct node{
	int date,prarent;//分别是数据域和父节点
}tree[maxn];//10个节点的数组存储

         树的存储形式如下表所示

data 1 2 3 4 5 6 7 8 9 10
parent -1 1 1 1 2 2 2 3 3 4

二、树转化成二叉树  

        因为数的分枝不确定,所以很多情况下其操作起来很不方便,而二叉树最多只有两个节点,即一个左子树和一个右子树,操作和表示起来都会简单很多。通常情况下,对树的处理都是先将其转化成二叉树。

        树转化成二叉树的方法:将一棵树的孩子节点放在二叉树的坐子树,将一棵树的兄弟节点放在右子树即可。

 图2 - 二叉树示意图

三、二叉树的表示

        由于二叉树最多只有左子树和右子树,所以存储时利用数组存储其左子树和右子树即可。

const int maxn=10;//10个节点
char data[maxn];
char lchild[maxn];//10个节点的左子树信息
char rchild[m];//10个节点的右子树信息
int btree;//根节点

         存储示例如下:

data 1 2 3 4 5 6 7 8 9 10
Lchild 2 5 8 10 -1 -1 -1 -1 -1 -1
Rchild -1 3 4 -1 6 7 -1 9 -1 -1

四、二叉树的访问

        利用递归程序对二叉树进行访问非常简单,根据访问顺序可分为:先序遍历、中序遍历和后序遍历。先序遍历访问顺序是根左右,中序遍历访问顺序是左根右,后序遍历顺序是左右根。

代码实现

先序遍历

void predorder(int root)
{
	if(root!=-1)
	{
		cout<<data[root]<<" ";
		predorder(lchild[root]);
		predorder(rchild[root]);
	}
}

中序遍历

void midorder(int root)
{
	if(root!=-1)
	{
		midorder(lchild[root]);
		cout<<data[root]<<" ";
		midorder(rchild[root]);
	}
}

后序遍历

void postorder(int root)
{
	if(root!=-1)
	{
		postorder(lchild[root]);
		postorder(rchild[root]);
		cout<<data[root]<<" ";
	}
}

好啦,以上就是本章的内容啦,感谢阅读!


网站公告

今日签到

点亮在社区的每一天
去签到

热门文章