引言

最近一个项目需要使用多叉树结构来存储数据,但是基于平时学习的都是二叉树的结构,以及网上都是二叉树为基础来进行学习,所以今天实现一个多叉树的数据结构。

理论基础

树和二叉树

多叉树:多叉树,顾名思义,就是一个节点可能有若干个子节点,构造的一个较为复杂的树结构。

树的遍历:树的遍历一般认为有三种:前序遍历二叉树、中序遍历二叉树、后序遍历二叉树\(^{[2]}\)。

(1). 前序遍历二叉树。若二叉树为空,则为空操作,返回空否则访问根结点-->前序遍历左子树-->前序遍历右子树。

(2). 中序遍历二叉树。 若二叉树为空,则为空操作,返回空否则中序遍历左子树-->访问根结点-->中序遍历右子树。

(3). 后序遍历二叉树。若二叉树为空,则为空操作,返回空否则后序遍历左子树-->后序遍历右子树-->访问根结点。

本文特别强调:本文只有两种遍历方法,先根遍历和先叶遍历,先根遍历是首先遍历根节点,然后访问按顺序从左到右遍历子节点;先叶遍历指首先按照顺序从左至右遍历叶子节点,然后遍历根节点。

C++指针: 指针即为地址,一个指针对应一个地址,*p = &a \(^{[3-4]}\),其中a保存的是变量值,具体数据,*p 或者 &a表示的是一个地址编号,比如:0x80651165,即:a = 5p = 0x80651165,一句话描述,变量存储的是数据,指针存放的是地址,通过指针可以找到变量存放的位置,从而找到变量的具体值;

结构体:结构体可以理解为一个对象(但是class 和 struct 是有不同之处的),它是一种用户自定义的数据类型。

基于C++的N叉树的实现

头文件:

#include <iostream>
#include <vector>
using namespace std;
#ifndef DBM_MTREE_H
#define DBM_MTREE_H
typedef int T;
typedef struct MNode {
T element;
vector<MNode*> children;
MNode *Parent;
} MNode; class MTree {
private:
MNode *root;
public:
void init(MNode *root);
void putChild(MNode* node,MNode* parent);
void putChildren(vector<MNode*> nodes, MNode *parent);
void tranversal(MNode *root);
void tranversal();
int getMaxDepth(MNode *root,vector<MNode*> nodes);
};

实现:

void MTree::init(MNode *root) { this->root = root; }

void MTree::putChild(MNode *node, MNode *parent) {
parent->children.push_back(node);
node->Parent = parent;
} void MTree::putChildren(vector<MNode *> nodes, MNode *parent) {
for (int i = 0; i < nodes.size(); ++i) {
putChild(nodes[i], parent);
}
} void MTree::tranversal() {
this->tranversal(this->root);
} void MTree::tranversal(MNode *root) {
vector<MNode *> nodes = root->children;
for (int i = 0; i < nodes.size(); ++i) {
if (nodes[i]->children.size() > 0)
tranversal(nodes[i]);
else
cout << nodes[i]->element << ",";
}
cout << root->element << ",";
} int MTree::getMaxDepth(MNode *root,vector<MNode*> nodes) {
auto iResult = 0; return iResult;
}

源码:Gitee | Github | CSDN

实验验证

本章小结

学习数据结构一定是从思想角度去理解算法和数据结构的意义,而不要仅仅局限于某一种数据结构和算法,将一种算法和结构扩展化、实践化才是学习数据结构的根本目的,锻炼自己对问题建模的能力。

参考文献

[1]. 树和二叉树的定义

[2]. 二叉树遍历算法总结

[3]. C++指针详解

[4]. C/C++指针详解之基础篇(史上最全最易懂指针学习指南!!!!)

C++ N叉树的实现的更多相关文章

  1. Atitit. 构造ast 语法树的总结attilax oao 1. Ast结构树形12. ast view (自是个160k的jar )22.1. 多条语句ast结构22.2. 变量定义 int b,c; 的ast结构22.3. 方法调用meth1(a=1,b=2,c=3);  的ast结构23. 误解的问题33.1. 语法书子能是个二叉树,实际上多叉树越好..33.2. 非要不个ast放到个s

    Atitit. 构造ast 语法树的总结attilax oao 1. Ast结构树形1 2. ast view (自是个160k的jar )2 2.1. 多条语句ast结构2 2.2. 变量定义 in ...

  2. YTU 3026: 中序线索化二叉树

    原文链接:https://www.dreamwings.cn/ytu3026/2896.html 3026: 中序线索化二叉树 时间限制: 1 Sec  内存限制: 128 MB 提交: 9  解决: ...

  3. hdu 4044 GeoDefense (树形dp | 多叉树转二叉树)

    题目链接:hdu-4044 题意 这是一个塔防游戏,地图是一个n个编号为1-n的节点的树, 节点1是敌人的基地,其他叶子节点都是你的基地.    敌人的基地会源源不断地出来怪兽,为了防止敌人攻进你的基 ...

  4. 数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

    树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n ...

  5. 选课 树形DP+多叉树转二叉树+dfs求解答案

    问题 A: 选课 时间限制: 1 Sec  内存限制: 128 MB 题目描述 大 学里实行学分.每门课程都有一定的学分,学生只要选修了这门课并考核通过就能获得相应的学分.学生最后的学分是他选修的各门 ...

  6. 线索化二叉树的构建与先序,中序遍历(C++版)

    贴出学习C++数据结构线索化二叉树的过程, 方便和我一样的新手进行测试和学习 同时欢迎各位大神纠正. 不同与普通二叉树的地方会用背景色填充 //BinTreeNode_Thr.h enum Point ...

  7. BZOJ 3684: 大朋友和多叉树 [拉格朗日反演 多项式k次幂 生成函数]

    3684: 大朋友和多叉树 题意: 求有n个叶子结点,非叶节点的孩子数量\(\in S, a \notin S\)的有根树个数,无标号,孩子有序. 鏼鏼鏼! 树的OGF:\(T(x) = \sum_{ ...

  8. python实现 多叉树 寻找最短路径

    完全原创,能力有限,欢迎参考,未经允许,请勿转载 ! 完全原创,能力有限,欢迎参考,未经允许,请勿转载 ! 完全原创,能力有限,欢迎参考,未经允许,请勿转载 ! 完全原创,能力有限,欢迎参考,未经允许 ...

  9. BAT面试题:请使用递归构建N叉树

    题目要求: 现在我们拥有全国的省.市.县.镇的行政信息,比如 浙江省 -> 杭州市 -> 西湖区 --> xx街道,请将这些信息构建成一棵树,根节点为全国,叶子节点为镇. 我的误解: ...

  10. (N叉树 DFS 递归 BFS) leetcode 559. Maximum Depth of N-ary Tree

    Given a n-ary tree, find its maximum depth. The maximum depth is the number of nodes along the longe ...

随机推荐

  1. CF827D Best Edge Weight[最小生成树+树剖/LCT/(可并堆/set启发式合并+倍增)]

    题意:一张图求每条边边权最多改成多少可以让所有MST都包含这条边. 这题还是要考察Kruskal的贪心过程. 先跑一棵MST出来.然后考虑每条边. 如果他是非树边,要让他Kruskal的时候被选入,必 ...

  2. JDK、JRE、JVM的区别与关系

    JDK JDK是Java开发工具包,是Sun Microsystems针对Java开发员的产品. JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和lib,在这里 ...

  3. jmeter-post请求自动变成get,提示请求方式错误,修改协议即可

    修改协议: http  改为  https  或反之

  4. vscode 远程编辑文件

    操作 安装扩展 remote-vscode 配置ssh 转发: 添加 RemoteForward 52698 127.0.0.1:52698 到 ~/.ssh/config: # Read more ...

  5. 适配器模式(Adapter)---结构型

    1 基础知识 定义:将一个类的接口(被适配者)转换成客户期望的另一个接口(目标).特征:使原本接口不兼容的类可以一起工作. 本质:转换匹配,复用功能.把不兼容的接口转换为客户端期望的样子从而实现功能的 ...

  6. Java 面试题 三 <JavaWeb应用调优线程池 JVM原理及调优>

    1.Java Web应用调优线程池 不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文由浅入深,介 ...

  7. SpringMVC——拦截器,过滤器实现登录拦截

    一.拦截器与过滤器的区别 1.过滤器 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操 ...

  8. python_re模块

    正则表达式:http://www.regexlab.com/zh/regref.htm

  9. OVS报错:s1.mgmt: version negotiation failed (we support version 0x01, peer supports version 0x04) ovs-ofctl: s1: failed to connect to socket (Broken pipe)

    mininet搭建拓扑后,查看流表,发现ovs命令报错 查找原因发现系mininet创建拓扑的命令使用了OpenFlow 1.3版本 ovs dump-flows命令默认是1.0版本,因此需要在ovs ...

  10. 预处理、const、static与sizeof-#pragma pack的作用

    1:有如下代码: #include <iostream.h> #pragma pack(1) struct test{ char c; short s1; short s2; int i; ...