多叉树的构建

实现一棵多叉树

这棵树可以有任意多颗子树 0-n

    1
 2  3  4
5 6 7  8

输入建立二叉树,输入的格式是每个节点的具体数据和拥有的孩子数目

例如上面的树是这样建成的:
1 3
2 2
5 0
6 0
3 1
7 0
4 1


 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 using namespace std;
 5 
 6 struct node
 7 {
 8     int item;
 9     vector<node*> children;
10 };
11 
12 node* build()
13 {
14     int t, n;
15     cin >> t >> n;
16     node* p = 0;
17     p = new node;
18     p->item = t;
19     for (int i = 0; i != n; ++i)
20     {
21         p->children.push_back(build());
22     }
23     return p;
24 }
25 
26 void level(node* root)
27 {
28     if (root != 0)
29     {
30         node* t;
31         queue<node*> q;
32         q.push(root);
33         while (!q.empty())
34         {
35             t = q.front();
36             cout << t->item << ' ';
37             q.pop();
38             for (vector<node*>::size_type i = 0; i != t->children.size(); ++i)
39             {
40                 q.push(t->children[i]);
41             }
42         }
43     }
44 }
45 
46 int    main()
47 {
48     node* root = 0;
49     root = build();
50     level(root);
51     return 0;

52 }


Node* createMultTree(const char *str, int n)
{
   assert(str != NULL);  //字符串错误

   if('\0' == str[0] || n <= 0)   //空字符串或非叉树
       return NULL;

   Node *tree;   //建立多叉树的首节点
   tree = new Node;
   tree->data = *str++;
   tree->depth = 1;
   
   queue<Node *> q;  //首节点如队列中
   q.push(tree);

   Node *parent, *child;
   while(*str) {
      parent = q.front();
      q.pop();
      //n叉树中每个节点有n个子节点
      for(int i = 0; i < n && *str; i++) {
              child = new Node;
              child->data = *str++;
              child->depth = parent->depth + 1;
              parent->child.push_back(child);
              q.push(child);  //每个节点入队列,每层建立完后再建立下层
      }
   }
   return tree;
}

Java叉树可以用于构建家谱,以下是一个简单的实现示例: ```java class Person { private String name; private List<Person> children; public Person(String name) { this.name = name; this.children = new ArrayList<>(); } public String getName() { return name; } public void addChild(Person child) { this.children.add(child); } public List<Person> getChildren() { return children; } } public class FamilyTree { private Person root; public FamilyTree(String name) { this.root = new Person(name); } public Person getRoot() { return root; } public void addPerson(Person parent, Person child) { parent.addChild(child); } public static void main(String[] args) { FamilyTree familyTree = new FamilyTree("张三"); Person parent1 = familyTree.getRoot(); Person child1 = new Person("李四"); familyTree.addPerson(parent1, child1); Person parent2 = child1; Person child2 = new Person("王五"); familyTree.addPerson(parent2, child2); System.out.println(familyTree.getRoot().getName()); for (Person child : familyTree.getRoot().getChildren()) { System.out.println(" " + child.getName()); for (Person grandChild : child.getChildren()) { System.out.println(" " + grandChild.getName()); } } } } ``` 在上面的示例中,`Person`类代表一个人,每个人有一个名字和个子节点,即其子女。`FamilyTree`类代表家谱,其中`root`字段为根节点,表示家谱的起始人物。`addPerson`方法用于向家谱中添加人物。在`main`方法中,先创建家谱的起始人物张三,然后添加李四作为其子女,再添加王五作为李四的子女。最后,通过遍历树的方式输出家谱的信息。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值