首页 > 代码库 > 任意树的构造

任意树的构造

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

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

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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 }

 

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

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

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

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

以上。

任意树的构造