引言

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

理论基础

树和二叉树:

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

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

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

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

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

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

C++指针: 指针即为地址,一个指针对应一个地址,*p = &a \(^{[3-4]}\),其中a保存的是变量值,具体数据,*p 或者 &a表示的是一个地址编号,比如:0x80651165,即:a = 5 , p = 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. Bootstrap-轮播图-No.9

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  2. springboot2.0入门(四)----mock模拟测试+单元测试

    一.本节主要记录模拟测试.单元测试: 二.mock 测试 1.1什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象 ...

  3. 分布式协调框架_Zookeeper

    Zookeeper 如今在分布式架构中应用十分广泛,它作为分布式协调框架在分布式架构中有着举足轻重的地位,本文是主要从以上几个方面对 Zookeeper 常用的知识进行总结. 一 从集中式到分布式架构 ...

  4. [Luogu] 列队

    https://www.luogu.org/problemnew/show/P3960 如果 x = 1,相当于维护一条链,每次取出第 k 个数放在序列末尾假设有 n + m + q 个位置,每个位置 ...

  5. 【luogu4781】拉格朗日插值

    题目背景 这是一道模板题 题目描述 由小学知识可知,nn个点(x_i,y_i)(xi​,yi​)可以唯一地确定一个多项式 现在,给定nn个点,请你确定这个多项式,并将kk代入求值 求出的值对99824 ...

  6. Go中&和*的区别

    & 返回变量的内存地址 * 返回变量的值, * 只能作用在指针上 package main import "fmt" func main() { var a = 5 var ...

  7. Python: 关于 sys.stdout.flush()

    stackoverflow https://stackoverflow.com/questions/10019456/usage-of-sys-stdout-flush-method Python's ...

  8. 标准输入输出(C++)

    输入输出流函数(模板) #include<iostream> #include<iomanip> using namespace std; int main() { cout ...

  9. loj541

    七曜圣贤 sol:我标算还没写过,似乎分块就可以过(因为数据是随机的),我写个set可以有70~80分 //C++ #include<bits/stdc++.h> using namesp ...

  10. js判断滚动条是否已到页面最底部或顶部实例

    原文 本文实例讲述了js判断滚动条是否已到页面最底部或顶部的方法.分享给大家供大家参考.具体分析如下: 我们经常会看到很多的网站一个返回顶部效果就是当我们滚动条到指定位置时返回顶部出来了,否则就自动隐 ...