任意树的构造

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

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

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

任意树的构造的相关文章

依据数据集 进行 树 的构造(treeview & dataset) 方法一

type PDepData=^DepData; DepData = record ID: Integer; DepID: string; DepName: string; end; procedure FreeTV(tv: TTreeview); var i: Integer; begin for i := 0 to tv.Items.Count - 1 do begin dispose(tv.Items[i].Data); end; tv.Items.Clear; end; procedure

LeetCode总结 -- 树的构造篇

这篇总结主要介绍树中比较常见的一类题型--树的构造.其实本质还是用递归的手法来实现,但是这类题目有一个特点,就是它是构建一棵树,而不是给定一棵树,然后进行遍历,所以实现起来思路上有点逆向,还是要练习一下.LeetCode中关于树的构造的题目有以下几道:Convert Sorted Array to Binary Search TreeConvert Sorted List to Binary Search TreeConstruct Binary Tree from Preorder and I

(源码,具体的细节请查阅相关资料)哈弗曼树的构造以及非递归遍历树

写了一点haffman树的创建和二叉树的非递归遍历. 如果编写代码的时候出现了,思维断点,可以借鉴一下, 避免浪费一些不必要的时间. 我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占 位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我 是占位符我是占位符我是占位符我是占位符我是占位符我是 占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符

简洁常用权限系统的设计与实现(三):维护和利用节点的深度level,迭代实现树的构造

如果在节点的属性中,增加一个level属性,即树的深度,构造树会非常容易.前提是,增加和修改节点的时候,要维护level. 根节点的level为1,下一级为2,以此类推. 构造树的方法,主要有2个: // 按照level排序,根节点在上,子结点在下 public static List<Map<String, Object>> buildTree(List<TreeNode> list) { List<Map<String, Object>> r

HDU3516 树的构造

题目大意:平面上有n个点,构成一个单调递减的序列.即对于任意的i<j,有xi<xj,yi>yj.现在要用一棵树连接这n个点.树边为有向边,只能向右或向上.求最小的权值. 分析:本题其实是式子合并的变形. f[i][j]=f[i][k]+f[k+1][j]+y[k]-y[j]+x[k+1]-x[i] 其中s[i][j-1]<=s[i][j]<=s[i+1][j] 1 #include<iostream> 2 #include<cstdio> 3 #inc

线段树的构造

题目描述:线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start 和 end 由 build 方法所给出. 对于节点 A 的左儿子,有 start=A.left, end=(A.left + A.right) / 2. 对于节点 A 的右儿子,有 start=(A.left + A.right) / 2 + 1, end=A.right. 如果 start 等于 end, 那么该节

转载:哈夫曼树的构造和哈夫曼编码(C++代码实现)

作者:qiqifanqi 原文:http://blog.csdn.net/qiqifanqi/article/details/6038822 #include<stdio.h> #define MAX 100 #define MAXVALUE 500 typedef struct { int weight; int parent,lchild,rchild; }node; /*哈夫曼树结点类型*/ /*-----------------------------以下部分定义哈夫曼编码存储结构--

哈夫曼树的构造

#include<iostream> #include<string> using namespace std; struct ElemType { char date; int weight; }; struct HTNode { char data; int weight; int parent,lchild,rchild; string code; }; HTNode *createTree(ElemType *w,int n)//哈夫曼树构造 { HTNode *ht=ne

由二叉树构造赫夫曼树

赫夫曼树: 假设有n个权值{w1,w2,w3....},试构造一棵具有n个叶子节点的二叉树,每个叶子节点带权为wi,则其中带权路径长度最小的二叉树称为最优二叉树或者叫赫夫曼树. 构造赫夫曼树: 假设有n个权值,则构造出的赫夫曼树有n个叶子节点,n个权值分别设置为w1,w2,....wn,则赫夫曼树的构造规则为: 1.将w1,w2...看成是有n棵树的森林: 2.在森林中选择两个根节点的权值最小的树合并,作为一棵新树的左右子树,且新树的根节点权值为其左右子树根节点权值之和: 3.从森林中删除选取的