主要使用交互的方式进行树的创建,因此要求输入的时候必须准确,最好是先有一个示意图来对照着输入:
下面是使用链表的方式构建的树,思路主要是进行递归进行添加。
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 }
原则上来说可以进行任意造型的树的构建,但是只能手工输入,无法从外部读取自动构建。
本来想把输出那里写成有层次一点的输出,但是因为本来写的函数就不太好,所以后来放弃了。希望以后能有更好的解决方案。
下面是我的测试,只有一条枝杈的树:
未经严格测试,如果有错误希望读者不吝赐教,不胜感激。
以上。
时间: 2024-10-30 07:03:39