`
isiqi
  • 浏览: 16032517 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

N叉树一 基本实现

 
阅读更多

丢了一次以前写的算法的文档和源代码,Ubuntu One不可靠啊!只好从头再写一遍。

本文实现了一个树,不是二叉树,是N叉树。也就是允许一个节点拥有多个子节点。

不是为了做题目糊弄人,所以内存管理不允许泄漏,用了C++11的shared_ptr。先看看调用代码:

#include <iostream>
#include <memory>

using namespace std;

#include "tree.h"
using namespace freebird;


using node_type = shared_ptr<node<int>>;
using node_iterator = vector<shared_ptr<node<int>>>::iterator;

tree<node_type> t;

void init(){
  node_type n1(new node<int>(1));
  t.root(n1);

  node_type n2(new node<int>(2));
  node_type n3(new node<int>(3));
  node_type n4(new node<int>(4));

  n1->push_back(n2);
  n1->push_back(n3);
  n1->push_back(n4);

}

void view_root(){
  node_type r = t.root();
  cout<<"the value of root:"<<r->value()<<endl;

  node_iterator itor = r->begin();
  node_iterator last = r->end();
  for(;itor!=last;++itor){
    node_type cur_node = *itor;
    cout<<"the value of root's one child:"<<cur_node->value()<<endl;
  }

}

int main(int args,char* argv[]){
  
  init();

  view_root();



}


init函数初始化tree,放了一个根节点,然后加入三个子节点。

view_root将四个节点数据遍历出来。

tree这个类看上去可有可无,其实不然。今后会将查找,遍历等算法封装在tree类里面,方便使用。

注意using的用法,是C++11的template aliases。

using node_type = shared_ptr<node<int>>;


我用的是GCC4.7.0,Ubuntu 12.04,CMake.

现在看看tree.h中的实现。

#ifndef _TREE_H
#define _TREE_H

#include <vector>
#include <memory>

namespace freebird {

  template<typename T>
    class node{
  public:
  node(T value):value_(value){
    }



    /**
     * insert child node to the end
     */
    void push_back(std::shared_ptr<node<T>> child){
      children_.push_back(child);
    }

    typedef typename std::vector<shared_ptr<node<T>>>::iterator iterator_type;

    void insert(iterator_type pos,std::shared_ptr<node<T> > child){
      children_.insert(pos,child);
    }

    T value() const {
      return value_;
    }


    /**
     * iterator to the first child
     */
    iterator_type begin(){
      return children_.begin();
    }

    /**
     * Get the end iterator of children
     */
    iterator_type end(){
      return children_.end();
    }

  private:
    T value_;

    std::vector<shared_ptr<node<T>>> children_;
  };



  template<typename T>
    class tree {
  public:
    tree<T>(){
    }

    void root(T node){
      root_ = node;
    }

    T root() {
      return root_;
    }
    
  private:
    T root_;
  };
}

#endif

shared_ptr就在memory头文件中,不再需要加入boost库。

实现还是挺简单的,用了一个vector,里面存放了shared_ptr<node<T>>,因此删除的时候不要手动delete。只是小心不要在树里面节点形成回路,那是shared_ptr最忌讳的。‘




分享到:
评论

相关推荐

    哈夫曼树的相关程序,试验

    Huffman HuffmanCoding(Huffman Hfm)//将输入的字符以及他的权值,按照哈夫曼规则建立2叉树 { /*---------------------------------*/ int i,n,m,s1,s2,start; int c,f; char *cd; n=Hfm.longth; if(n) ...

    数据结构C++描述

    11.4.2 m 叉搜索树 345 11.4.3 m 序B-树 346 11.4.4 B-树的高度 347 11.4.5 B-树的搜索 348 11.4.6 B-树的插入 348 11.4.7 B-树的删除 350 11.4.8 节点结构 353 11.5 应用 354 11.5.1 直方图 354 11.5.2 用最优...

    LeetCode判断字符串是否循环-Data-Structures-and-Algorithms:记录学习数据结构与算法的笔记

    LeetCode判断字符串是否循环 Data-Structures-and-Algorithms ...n叉树的遍历 数组迭代 题目: 322: 凑零钱(数组迭代/递归) 509: 斐波那契数列(迭代) 回溯算法 n叉树遍历 46: 全排列 51: n皇后 其他文章

    C# TrieTree介绍及实现方法

    在自然语言处理(NLP)研究中,NGram是最基本但也是最有用的一种比对方式,这里的N是需要比对的字符串的长度,而今天我介绍的TrieTree,正是和NGram密切相关的一种数据结构,有人称之为字典树。TrieTree简单的说是一...

    TreeOfLife:生命之树

    里程碑9(版本1.0.915.1000.M9.210129-2000)原始数据结构由N叉树替换增加有向图,实现并系群,复系群的编辑与存储,版本控制首次获得验证,删除的类群将自动从搜索结果中移除,更新中文名由自动改为提示。...

    数据结构(C++)有关练习题

    2、利用二叉搜索树实现一个音像商店(小型书店、小型超市、或小型药店)的交易管理系统,要求实现以下功能: a. 该系统应该有一个字符型的主菜单; b. 能按字母顺序显示库存商品的名称和数量; c. 能添加...

    Interview

    如果不存在,则返回-1给定一个不含重复元素的整数nums,返回该数组所有可能的子集(幂集)二叉树的遍历链表的基本操作给定一个链表,两两交换其中相邻的中断,并返回交换后的链表。斐波那契数给定一个整数n,生成...

    数据结构:八大数据结构分析.pdf

    ⼆叉树是⼀种⽐较有⽤的折中⽅案,它添加,删除元素都很快,并且在查找⽅⾯也有很多的算法优化,所以,⼆叉树既有链表的好处,也有 数组的好处,是两者的优化⽅案,在处理⼤批量的动态数据⽅⾯⾮常有⽤。...

    经典SQL脚本大全

    │ │ 7.2.1 TOP n 实现的通用分页存储过程.sql │ │ 7.2.2 字符串缓存实现的通用分页存储过程.sql │ │ 7.2.3 临时表缓存实现的通用分页存储过程.sql │ │ 7.2.4 使用系统存储过程实现的通用分页存储过程.sql │...

    leetcode备忘录系统-Algorithms-DataStructures:算法-数据结构

    四叉树 中序、前序、后序遍历 二叉树的最大深度 验证二叉搜索树 将有序数组转换为二叉搜索树 面向对象编程术语 - Abstraction - Inheritance - Cohesion - Coupling 集合和数学 API - Maps - Lists - Concurrency 二...

    会计理论考试题

    C、CPU能接受的基本指令 D、接近自然语言的计算机指令 13.下列关于计算机病毒的说法中,正确的是 __A___ 。 A、计算机病毒通常是一段可运行的程序 B、反病毒软件可清除所有病毒 C、加装防病毒卡的微机不会感染病毒 D...

    Sqlserver2000经典脚本

    基本方法.sql │ ├─第08章 │ │ 8.1.2 树形数据分级汇总示例.sql │ │ 8.1.3 树形数据编号重排的通用存储过程.sql │ │ 8.1.3 树形数据编号重排示例.sql │ │ 8.1.4 实现编码规则...

    数据挖掘weka数据分类实验报告.doc

    四、实验过程及结果 应用iris数据集,分别采用LibSVM、C4.5决策树分类器和朴素贝叶斯分类器进行测试 和评价,分别在训练数据上训练出分类模型,找出各个模型最优的参数值,并对三个模 型进行全面评价比较,得到一个...

    软件工程知识点

    (3)工程过程:在软件工具支持下的一系列工程活动,基本活动是软件定义、软件开发、 软件验证、软件维护。 (4)工程管理:项目规划,项目资源调配,软件产品控制。 (5)工程原则:分阶段生命周期计划,阶段评审...

    jpivot学习总结.doc

    属性很多,并且是 schema 编写的关键,使用它可以构成一个结构树, Level 的先后顺序决定了 Level 在这棵树上的的位置,最顶层的 Level 位于树的第一级,依次类推。 Level 的属性如下: 属性名 含义 name 名称 ...

    ireport开发文档

    36 i18n: 36 Resource Bundle Base name 36 XML源文件的编码设置: 37 5 报表元素 37 选择并插入元素到报表中: 37 布置和元素顺序 40 使用元素树管理元素: 43 基本属性: 43 线 46...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    1. 层次结构模型: 层次结构模型实质上是一种有根结点的定向有序树,IMS(Information Manage-mentSystem)是其典型代表。 2. 网状结构模型:按照网状数据结构建立的数据库系统称为网状数据库系统,其典型代表是DBTG...

    iReport开发文档

    36 i18n: 36 Resource Bundle Base name 36 XML源文件的编码设置: 37 5 报表元素 37 选择并插入元素到报表中: 37 布置和元素顺序 40 使用元素树管理元素: 43 基本属性: 43 线 46...

    SQL SERVER 2000开发与管理应用实例

    7.2.1 使用TOP N实现分页 207 7.2.2 使用字符串 211 7.2.3 使用临时表 213 7.2.4 使用SQL Server的系统存储过程处理分页 216 7.3 特殊要求的分页处理 217 7.3.1 随机显示的分页处理 217 7.3.2 ...

    sqlserver2000基础(高手也有用)

    7.2.1 使用TOP N实现分页 207 7.2.2 使用字符串 211 7.2.3 使用临时表 213 7.2.4 使用SQL Server的系统存储过程处理分页 216 7.3 特殊要求的分页处理 217 7.3.1 随机显示的分页处理 217 7.3.2 分类数据...

Global site tag (gtag.js) - Google Analytics