码迷,mamicode.com
首页 > 其他好文 > 详细

任意树的构造

时间:2014-11-22 20:13:44      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   使用   sp   

主要使用交互的方式进行树的创建,因此要求输入的时候必须准确,最好是先有一个示意图来对照着输入:

下面是使用链表的方式构建的树,思路主要是进行递归进行添加。

main.cpp

  1 #include "iostream"
  2 #include "stdlib.h"
  3 /*一般树的建立和遍历*/
  4 
  5 typedef struct _treenode_
  6 {
  7     int data;
  8     struct _treenode_ *firstChild;//指向第一子节点
  9     struct _treenode_ *nextSibling;//指向兄弟节点
 10 }treeNode;
 11 
 12 treeNode *initRoot(int data);
 13 void addBrother(treeNode *old);
 14 void addChild(treeNode *father);
 15 
 16 treeNode *initRoot(int data)/*初始化根节点*/
 17 {
 18     treeNode *p = (treeNode *)malloc(sizeof(treeNode));
 19     p->data = data;
 20     p->firstChild = nullptr;
 21     p->nextSibling = nullptr;
 22     return p;
 23 }
 24 
 25 void addBrother(treeNode *old)/*向old节点添加兄弟节点*/
 26 {
 27     int data;
 28     char con;
 29     std::cout << "请输入要为 " << old->data << " 添加的兄弟节点数据:";
 30     std::cin >> data;
 31     treeNode *p = (treeNode *)malloc(sizeof(treeNode));
 32     p->data = data;
 33     p->firstChild = nullptr;
 34     p->nextSibling = nullptr;
 35     old->nextSibling = p;
 36     std::cout << "是否要为 "<<p->data<<" 节点添加子节点?(y/n):";
 37     std::cin >> con;
 38     if (con == y)
 39     {
 40         addChild(p);
 41     }
 42     std::cout << "是否要为 "<<p->data<<" 节点添加兄弟节点?(y/n):";
 43     std::cin >> con;
 44     if (con == y)
 45     {
 46         addBrother(p);
 47     }
 48 }
 49 
 50 void addChild(treeNode *father)
 51 {
 52     int data;
 53     char con;
 54     std::cout << "请输入要为 " << father->data << " 添加的子节点数据:";
 55     std::cin >> data;
 56     treeNode *p = (treeNode *)malloc(sizeof(treeNode));
 57     p->data = data;
 58     p->firstChild = nullptr;
 59     p->nextSibling = nullptr;
 60     father->firstChild = p;
 61     std::cout << "是否要为此节点"<<p->data<<"添加子节点?(y/n):";
 62     std::cin >> con;
 63     if (con == y)
 64     {
 65         addChild(p);
 66     }
 67     std::cout << "是否要为节点" << p->data << "添加兄弟节点?(y/n):";
 68     std::cin >> con;
 69     if (con == y)
 70     {
 71         addBrother(p);
 72     }
 73 }
 74 
 75 void createTree(treeNode *&root)
 76 {
 77     addChild(root);
 78 }
 79 
 80 void printOut(treeNode *root)
 81 {
 82     if (root != nullptr)
 83     {
 84         std::cout << root->data << std::endl;
 85     }
 86     if (root->firstChild != nullptr)
 87     {
 88         printOut(root->firstChild);
 89     }
 90     if (root->nextSibling != nullptr)
 91     {
 92         printOut(root->nextSibling);
 93     }
 94 }
 95 
 96 int main(void)
 97 {
 98     treeNode *root = nullptr;
 99     int data;
100     std::cout << "请输入根节点的数据:";
101     std::cin >> data;
102     root = initRoot(data);
103     createTree(root);
104     printOut(root);
105     system("pause");
106     return 0;
107 }

 

原则上来说可以进行任意造型的树的构建,但是只能手工输入,无法从外部读取自动构建。

本来想把输出那里写成有层次一点的输出,但是因为本来写的函数就不太好,所以后来放弃了。希望以后能有更好的解决方案。

下面是我的测试,只有一条枝杈的树:

bubuko.com,布布扣

未经严格测试,如果有错误希望读者不吝赐教,不胜感激。

以上。

任意树的构造

标签:style   blog   http   io   ar   color   os   使用   sp   

原文地址:http://www.cnblogs.com/lhyz/p/4115555.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!