#include<iostream>
using namespace std;
struct node {
int data;
node *parent; //指向父节点
node *son; //指向孩子节点链的头节点
node *bro; //指向兄弟节点
};
void insert_node(int dad,node *a,node *b) {
if (a->data==dad) { //定位到父节点
if (a->son==NULL) {a->son=b;b->parent=a;} //父节点没有子节点,直接连接到父节点
else { //父孑点有子节点,连接到子节点的兄弟节点
node *p=a->son;
while (p->bro!=NULL) {p=p->bro;}
p->bro=b;
b->parent=p->parent;
}
}
else {
if (a->bro==NULL) {insert_node(dad,a->parent->son->son,b);} //递归遍历寻找父节点
else {insert_node(dad,a->bro,b);}
}
return;
}
void find(int x,node *y) {
if (y->data==x) {
node *p=y;
if (p->parent->parent==NULL) {
cout<<x<<"是根节点!"<<endl;
return;
}
cout<<x<<"的父节点:";
while (p->parent->parent!=NULL) { //从父节点输出到根节点
cout<<"-->"<<p->parent->data;
p=p->parent;
}
cout<<endl;
cout<<x<<"的兄弟节点:"; //输出兄弟节点链
p=y->parent->son;
while(1) {
cout<<"-"<<p->data<<"-";
if (p->bro==NULL) {
break;
}
else {
p=p->bro;
}
}
cout<<endl;
}
else {
if (y->bro!=NULL) { //遍历寻找节点
find(x,y->bro);
}
if (y->son!=NULL) {
find(x,y->son);
}
}
}
int main() {
node root,rroot;
cout<<"请输入根节点:";
cin>>root.data;
root.bro=NULL;root.parent=&rroot;root.son=NULL;rroot.son=&root;rroot.parent=NULL;rroot.bro=NULL;
while(1) {
cout<<"请输入节点及它的父节点,输入-1 -1结束:";
node *box=new node;
box->bro=NULL;box->parent=NULL;box->son=NULL;
int dad;
cin>>box->data>>dad;
if (box->data==-1&&dad==-1) {break;}
else {insert_node(dad,&root,box);}
}
while(1) {
cout<<"请输入要查找的节点,输入-1结束:";
int x;
cin>>x;
if (x==-1) {break;}
else {find(x,&root);}
}
return 0;
}
树的孩子兄弟表示法
于 2024-01-20 16:00:06 首次发布