数据结构-多叉树

简介:

从图的角度看,树等价于连通无环图。因此与一般的图相同,树也由一组顶点以及连接与其间的若干条边组成。在计算机科学中,往往会在此基础上,再指定某一特定顶点,并称之为根。

图示:

在这里插入图片描述如图所示,1号节点为根节点。为了便于区别,这里根代指根节点,节点代指除根节点外的其他节点。

C语法实现:
#include<bits/stdc++.h>
using namespace std;

#define MAX_SIZE 100

struct Data{//所需结构体申明
 	char name;
 	int parent;
}; 
typedef struct Node{
 	Data data;
 	Node *next;
}*Tree;

Tree tree;//全局变量
int index = 1;
int width[MAX_SIZE];

void init_node_data_parent(Tree &tree){
 	for(int i = 0; i < MAX_SIZE; i++)
  		tree[i].data.parent = -2;
}
void init_root_node(Tree &root, char chr){
 	root->data.name = chr;
 	root->data.parent = -1;
 	root->next = NULL;
}
void init_node(Tree &node){//节点置空 
  	node->next = NULL;
}
void init_tree(Tree &root){//初始化tree,通过顺序表保存节点关系。指定根 
 	tree = new Node[MAX_SIZE];
 	init_tree_parent(tree);
 	root = new Node;
 	init_root_node(root, 'R');
 	tree[0] = *root;
}
void insert_node(Tree &node){
 	init_node(node);
 	tree[index++] = *node;
 	node->next = tree[node->data.parent].next;
 	tree[node->data.parent].next = node;
}
string get_oneself_son(Node *hed){
 	string temp = "";
 	for(Tree i = hed->next; i; i = i->next){
  		temp += i->data.name;
		temp += " ";
 	}
 	return temp;//return 问题 
}
void print_oneself_son(Node *hed){
 	cout << get_oneself_son(hed);
}
int get_max_parent(){//通过最大父节点获得 
 	int max = 0;
 	for(int i = 0; i < MAX_SIZE; i++)
  		if(tree[i].data.parent > max)
   			max = tree[i].data.parent;
 	return max+1;
}
int get_max_width(){
  	int max = 0;
  	for(int i = 0; i < MAX_SIZE; i++)
    	if(width[i] > max)
      	max = width[i];
  	return max;
}
int print_parent_leave(int leave){//打印每层节点
 	int count = 0;
 	for(int i = 0; i < MAX_SIZE; i++){
  		if(tree[i].data.parent == leave){
   			cout << tree[i].data.name << " "; 
   			++count;
  		} 
 	} 
 	cout << endl;
 	return count;
}
void print_all_parent(){
 	memset(width, -1, sizeof(width));
 	for(int i = 0; i <= get_max_height(); i++){
  		if(tree[i].data.parent != -2){
   			width[i-1] = print_parent_leave(i);
  		} 
 	}
}
void init_name(char *name){//这里通过系统创建节点,也可以采用控制台输入
 	for(int i = 0; i < 26; i++)
  		name[i] = 'A' + i;
}

int main(){
 	char name[26];
 	init_name(name);
 	Tree root;
 	init_tree(root);
 	//添加节点 
 	for(int i = 0; i < 100; i++){
  		Tree temp = new Node;
  		temp->data.name = name[rand()%26];
  		temp->data.parent = rand() % 10;
  		insert_node(temp);
 	}
 	print_all_parent();
 	return 0;
}

实现思路:通过顺序表存储每一个节点,然后由每个节点的父节点索引下标,将节点挂到父节点后。即每一个节点通过指针指向自己的所有儿子节点(不包括孙子等节点)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值