数据结构 - 树 复习(不详细)

数据结构 - 树

首先回忆一下树的术语

  1. 节点的度:一个节点含有的子树的个数称为该节点的树
  2. 树的度:一棵树中,最大的节点的度称为树的度
  3. 节点的层次:从根开始定义,根为第一层(有时候定义为第0层)
  4. 高度:对于任意节点n,n的高度为n到一片树叶的最长路径的长度,所有树叶的高度为0

树的遍历

  • 前序遍历:先访问根,然后访问左右子树
  • 中序遍历:先访问左子树,然后访问根,最后访问右子树
  • 后序遍历:先访问子树,然后访问根
  • 层序遍历:先访问离根节点最近的节点,按层遍历
#include<iostream>
using namespace std;

//树,定义左右子树
struct Node
{
	int lch = -1; //左节点 
	int rch = -1; //右节点 
	//现在都是-1,表示现在什么都不指向 
}; 

bool vis[29];
bool isnotroot[29];

Node tree[29];
char s[5];
void build(int p,int l,int r)
{
	vis[p]=true;
	if(l>=0)
	{
		tree[p].lch=l;
		vis[l]=true;
		isnotroot[l]=true; 
	}
	if(r>=0)
	{
		tree[p].rch=r;
		vis[r]=true;
		isnotroot[r]=true;
	}
} 

void pre_order(int r)
{
	if(r<0)
	{
		return ;
	}
	
	//递归 
	cout<<char(r+'a');
	pre_order(tree[r].lch);
	pre_order(tree[r].rch);
	//四种遍历方法,就是改变这三句的顺序 
}
int main()
{
	int n;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>s;
		build(s[0]-'a',s[1]-'a',s[2]-'a');
	}
	
//输出,因为只有26个字母,直接输出树的根节点即可
	for(int i=0;i<26;i++)
	{
		if(vis[i]&&!isnotroot[i])  
		{
			pre_order(i);
			break;
		}
	}
	cout<<endl;
	return 0;
}

猜你喜欢

转载自www.cnblogs.com/serendipity-my/p/12663972.html