数据结构与算法——普通树的定义与C++实现
来源:互联网 发布:水木年华知乎 编辑:程序博客网 时间:2024/06/10 21:32
用树的第一个儿子和下一个兄弟表示法来表示一个树。
树的节点结构为:
struct TreeNode{
TYPE element;//该节点的元素
TreeNode *firstChild;//指向该节点的第一个孩子
TreeNode *nextSibling;//指向该节点的兄弟节点
};
上图的第一个儿子和下一个兄弟表示法如下图所示:
树的遍历:采用前序遍历(先根节点,再左孩子,最后右孩子);
该表示法实现树的中序遍历和后序遍历不太方便。。
源代码:
/************************************************************************* > File Name: tree_print.cpp > Author: > Mail: > Created Time: 2016年04月05日 星期二 09时10分02秒 ************************************************************************/#include <iostream>using namespace std;#define TYPE char//树的节点struct TreeNode{ TYPE element;//该节点的元素 TreeNode *firstChild;//指向该节点的第一个孩子 TreeNode *nextSibling;//指向该节点的兄弟节点};class Tree{ public: Tree(TreeNode * r = NULL):root(r){} Tree(int node_num); ~Tree(); void addNode(int i, int j); void preOrder();//前序遍历 void print();//打印 private: void print(TreeNode* node, int num); void addBrotherNode(TreeNode* bro, TreeNode* node); void preOrder(TreeNode* parent);//前序遍历 private: TreeNode * root;//该树的根};//打印树的形状void Tree::print(){ print(root, 0);}void printSpace(int num){ int i = 0; for(i = 0; i < num-3; i++) cout << " "; for(; i < num-2; ++i) cout << "|"; for(; i < num; ++i) cout << "_";}void Tree::print(TreeNode* node, int num){ if(node != NULL){ printSpace(num); cout << node->element << endl; print(node->firstChild, num+4); print(node->nextSibling, num); }}//前序遍历void Tree::preOrder(){ cout << "前序遍历: "; preOrder(root); cout << endl;}void Tree::preOrder(TreeNode* parent){ if(parent != NULL){ cout << parent->element << " "; preOrder(parent->firstChild); preOrder(parent->nextSibling); }}//分配并初始化所有的树结点Tree::Tree(int node_num){ root = new TreeNode[node_num]; char ch = 'A'; for(int i = 0; i < node_num; ++i){ root[i].element = ch + i; root[i].firstChild = NULL; root[i].nextSibling = NULL; }}//释放所有节点的内存空间Tree::~Tree(){ if(root != NULL) delete [] root;}//addNode将父子结点组对//如果父节点的firstChild==NULL, 则firstChild = node;//如果父节点的firstChild != NULL, 则void Tree::addNode(int i, int j){ TreeNode* parent = &root[i]; TreeNode* node = &root[j]; if(parent->firstChild == NULL) parent->firstChild = node; else addBrotherNode(parent->firstChild, node);}//将节点插入到兄弟节点void Tree::addBrotherNode(TreeNode* bro, TreeNode* node){ if(bro->nextSibling == NULL) bro->nextSibling = node; else addBrotherNode(bro->nextSibling, node);}//主函数int main(){ Tree tree(16);//分配十六个节点 tree.addNode(0, 1); tree.addNode(0, 2); tree.addNode(0, 3); tree.addNode(0, 4); tree.addNode(0, 5); tree.addNode(0, 6); tree.addNode(3, 7); tree.addNode(4, 8); tree.addNode(4, 9); tree.addNode(5, 10); tree.addNode(5, 11); tree.addNode(5, 12); tree.addNode(6, 13); tree.addNode(9, 14); tree.addNode(9, 15); cout << "Tree1: " << endl; tree.preOrder(); tree.print(); Tree tree2(9); tree2.addNode(0, 1); tree2.addNode(0, 2); tree2.addNode(1, 3); tree2.addNode(1, 4); tree2.addNode(2, 5); tree2.addNode(3, 6); tree2.addNode(5, 7); tree2.addNode(5, 8); cout << "Tree2: " << endl; tree2.preOrder(); tree2.print(); return 0;}
程序中tree1的形状为下图所示:
程序中tree2的形状为下图所示:
程序的运行结果为:
0 0
- 数据结构与算法——普通树的定义与C++实现
- 数据结构——普通树的定义与C++实现
- 数据结构与算法的实现 —— 结点定义与数据结构的选择
- 数据结构与算法专题之树——树与二叉树的定义与性质
- 数据结构与算法——B树的C++实现
- 数据结构与算法 二分法查找【Python与C】的实现
- 【算法】数据结构与算法分析学习笔记——第四章AVL树C语言实现
- 数据结构与算法分析——带有头结点的单链表的实现(C语言)
- 数据结构与算法专题之图——图的基本定义与存储
- 算法与数据结构【三】——栈的C语言实现
- 数据结构与算法之树&二叉树的定义
- 《数据结构与算法分析》—栈的链表和数组实现(C语言)
- 数据结构与算法分析—栈的数组实现(C语言)
- 数据结构与算法分析—循环队列的数组实现(C语言)
- 数据结构与C语言实现(十一)——图(下):最小生成树与Prim与Kruskal算法
- 《C语言接口与实现》——头文件数据结构定义研究
- 算法与数据结构基础2:C++String类的实现
- 数据结构与算法设计---链式栈的实现(C++)
- python内建函数sorted方法概述
- poj 2723 Get Luffy Out 2-SAT
- Animation Resources
- git提交到远程库时提示the authenticity of host can't be established
- Android 重构历程(一)
- 数据结构与算法——普通树的定义与C++实现
- 工程中关于class文件的参数在那块设置。
- AndroidStudio如何快速制作.so
- JavaScript 数据存储之Cookie篇
- drawRect & 内存 -> 深究
- An Awful Problem(水题)
- 由浅入深学Java Socket
- 聊聊Web App、Hybrid App与Native App的设计差异
- 用php+MySQL实现检索数据库里的内容。。。