简介:
从图的角度看,树等价于连通无环图。因此与一般的图相同,树也由一组顶点以及连接与其间的若干条边组成。在计算机科学中,往往会在此基础上,再指定某一特定顶点,并称之为根。
图示:
如图所示,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;
}
实现思路:通过顺序表存储每一个节点,然后由每个节点的父节点索引下标,将节点挂到父节点后。即每一个节点通过指针指向自己的所有儿子节点(不包括孙子等节点)。