数据结构、算法及应用 张宪超主编 科学出版社
1. 数据结构的基本概念知识
数据结构的逻辑结构由数据节点和连接两个节点的边组成。
数据节点的数据类型:整型,实数型,布尔型,字符型,指针数据类型
结构的分类:讨论逻辑结构( K,R)一般以关系集R为主:      线性结构,属性结构,图结构。
数据的存储结构:顺序存储,连接方法,索引方法,散列方法,分析一下这些不同的数据存储方式:顺序存储就是把一组节点放在一片地址相邻得存储单元,节点中的逻辑关系用存储单元之间的自然关系来表达。顺序存储是为使用整数编码访问数据节点提供了便利。
链接方法是在节点的存储结构中附加指针域来存储节点的逻辑关系。链接方法中的数据节点有两部分组成:数据域存放节点本身的数据,指针域存放指向其后继结点指针。该方法使用于经常需要增删节点而动态变化的数据结构。
索引方法:索引表中的存储空间是附加在节点存储空间之外的,每一个元素就是指向相应的数据节点的指针。索引适合于大数据量的时候,减少对数据的读取。
散列方式是一种索引的扩展,散列方法利用散列函数进行索引值的计算,然后通过索引技术求出该节点的指针地址。主要思想就是利用节点的关键字码来确定其存储的地址。散列函数应该尽量的将地址均匀分布。
2. 树结构的复习
2.1 树结构的定义
树是由n个节点组成的有限集合。在这个集合中没有直接前驱的节点称为根节点。当 n==0的时候,是一个空树;当 n>0的时候,所有的节点中仅有一个是根节点,其余的可以分成 m个不相交的子集合,每一个子集合都是满足树的定义,称为根的子树。
          关于树的一些名词解释:
          结点:树结构中等个每一个元素称为一个结点,该结点包括该元素的值和该元素的逻辑关系信息。
          边:使用 <m,n>表示,结点m 指向n
          双亲结点和孩子结点: <m,n>则m 是n的双亲结点,也称为父节点, n是m 的子节点。
          兄弟结点:如果两个结点有共同的双亲结点,则两个节点称为兄弟结点。
叶子结点:没有孩子结点的称为叶子结点
结点的度:就是该结点的孩子结点的书目
树的度:树结构中的所有节点的度的最大值
,然后往后面加
树的高度:输的高度是树的深入加 1.
路径:从输的一个结点 n到另一个结点m,如果存在一个有限集合 S连接两个结点,则是mn之间的一个路径
有序树:如果树中的结点的所有子树之间存在确定的次序关系,则称该树是有序树,反之是无序树。
森林:有多个互不相交的数组成的集合
树的基本性质
度为m的树,其第 i层上之多有m^i 个节点
的树
          完全二叉树:除了最后一层以外其他所有的结点树都达到最大值,二最后一层上的所有节点分布在该层最左边连续的位置上。其性质:叶子结点只能够在最后两层出现。对于任意一层结点,如果左子树的高度是 m右子树不能够大于m,也不小于 m-1。
          满二叉树:所有分支节点都有非空的左子树和非空右子树,所有的叶子结点都在同一层,这样的树称为满二叉树。叶子结点都在最后一层。
template <class T >
class BinaryTreeNode {
public:
    T element;
    BinaryTreeNode< T> * left;
    BinaryTreeNode< T> * right;
};
template <class T >
class BinaryTree {
private:
    BinaryTreeNode * root;
public:
    void visit(BinaryTreeNode< T> * node){
        cout << node->element << endl;
    }
    // 层次遍历,也就是广度优先遍历
    void level_order( BinaryTreeNode<T > * root ){
         queue< BinaryTreeNode<T >* > nodeQueue;
         BinaryTreeNode<T >* pointer = this->root;
         if(pointer){
            nodeQueue.push(pointer);
        }
         while(!nodeQueue.empty()){
            pointer=nodeQueue.front();
            visit(pointer);
            nodeQueue.pop();
             if(pointer->left){
                nodeQueue.push(pointer->left);
            }
             if(pointer->right){
                nodeQueue.push(pointer->right);
            }           
        }
    }
 
    //深度优先遍历分为前序遍历,中序遍历和后续遍历
    /*
     前序遍历就是先序遍历,
    1 访问根节点
    2. 前序遍历左子树
    3. 前序遍历右子树
    */
    void pre_order( BinaryTreeNode<T > * root ){
         if( root!= NULL){
            visit( root);
            pre_order( root->left);
            pre_order( root->right);
        }
    }
    //使用 stack
    void pre_order_no_recusion( BinaryTreeNode<T > * root ){
         stack< BinaryTreeNode<T >*> nodeStack;
         BinaryTreeNode<T >* pointer=root;
         while(!nodeStack.empty|| pointer){
             if(pointer){
                visit(pointer);
                 if(pointer->right!= NULL){
                    nodeStack.push(pointer->right);
                }
                pointer=pointer->left;
            }
             else{
                pointer=nodeStack.top();
                nodeStack.pop();
            }
        }
    }
 
    /*
     中序遍历
    */
    void in_order(BinaryTreeNode< T>* root){
         if( root!= NULL){
            in_order( root->left);
            visit( root);
            in_order( root->right);
        }
    }
    void in_order_no_recusion( BinaryTreeNode<T >* root ){
         stack< BinaryTreeNode<T >*> nodeStack;
         BinaryTreeNode<T >* pointer=root;
         while(!nodeStack.empty()||pointer){
             if(pointer){
                nodeStack.push(pointer);
                pointer=pointer->left;
            }
             else{
                pointer=nodeStack.top();
                visit(pointer);
                pointer=pointer->right;
                nodeStack.pop()
            }
        }
    }
    /*
    */
    void post_order( BinaryTreeNode<T >* root ){
         if( root!= NULL){
            post_order( root->left);
            post_order( root->right);
            visit( root);
        }
    }
    void post_order_no_recusion( BinaryTreeNode<T >* root ){
         stack< BinaryTreeNode<T >* > nodeStack;
         BinaryTreeNode<T >* pointer =root;
         BinaryTreeNode<T >* pre=root ;
         while(pointer){
             for(;pointer->left!= NULL;pointer=pointer->right){
                nodeStack.push(pointer);
            }
             while(pointer && (pointer->right == NULL||pointer->right==pre)){
                visit(pointer);
                pre=pointer;
                 if(nodeStack.empty()){
                     return;
                }
                pointer=nodeStack.top();
                nodeStack.pop();
            }
            nodeStack.push(pointer);
            pointer= pointer->right;
        }
    }
 
};

Tree各种遍历实现的更多相关文章

  1. PAT甲级——1102 Invert a Binary Tree (层序遍历+中序遍历)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90577042 1102 Invert a Binary Tree ...

  2. LeetCode 637. Average of Levels in Binary Tree(层序遍历)

    Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...

  3. POJ 3321 Apple Tree(后根遍历将树转化成序列,用树状数组维护)

    题意:一棵树,有很多分叉,每个分叉上最多有1个苹果. 给出n,接下来n-1行,每行u,v,表示分叉u,v之间有树枝相连.这里数据中u相当于树中的父节点,v相当于子节点. 给出两个操作: 1.C x  ...

  4. tree的遍历--广度优先遍历

    一.二叉树demo var tree = { value: '一', left: { value: '二', left: { value: '四', right: { value: '六' } } } ...

  5. Extjs4.x Ext.tree.Panel 遍历当前节点下的所有子节点

    Ext.define('WMS.controller.Org', { extend: 'Ext.app.Controller', stores: ['OrgUser', 'OrgTree'], mod ...

  6. 【数据结构与算法Python版学习笔记】树——树的遍历 Tree Traversals

    遍历方式 前序遍历 在前序遍历中,先访问根节点,然后递归地前序遍历左子树,最后递归地前序遍历右子树. 中序遍历 在中序遍历中,先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树. 后序遍 ...

  7. Mac 下如何使用 Tree 命令

    方式一 Mac 系统下默认是不带这条命令的,执行下面这条命令也可以打印出树状结构. find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g' 不想每 ...

  8. [LeetCode] 系统刷题4_Binary Tree & Divide and Conquer

    参考[LeetCode] questions conlusion_InOrder, PreOrder, PostOrder traversal 可以对binary tree进行遍历. 此处说明Divi ...

  9. PAT甲级——1123 Is It a Complete AVL Tree (完全AVL树的判断)

    嫌排版乱的话可以移步我的CSDN:https://blog.csdn.net/weixin_44385565/article/details/89390802 An AVL tree is a sel ...

随机推荐

  1. iClap的名字是怎么来的,clap是有什么特殊的意义么?

    iClap的名字来源于:Clap中文是鼓掌的意思,鼓掌代表合拍,一个团队的价值观以及工作方式合拍,是最重要的,当项目启动时,大家对产品认可,鼓掌开始实施:当项目成功上线,团队也会以鼓掌的形式庆祝:当我 ...

  2. AtCoder Regular Contest 080 C - 4-adjacent

    地址:http://arc080.contest.atcoder.jp/tasks/arc080_a 题目: C - 4-adjacent Time limit : 2sec / Memory lim ...

  3. redis安全设置

    1. 设置监听ip为本地和内网ip bind 127.0.0.1 192.168.1.99 ## 可以是多个ip,用空格分割 2. 设置监听端口 port 16379 3. 设置密码 在配置文件中加入 ...

  4. pigeon 介绍

    https://github.com/dianping/pigeon Pigeon开发指南 Pigeon是一个分布式服务通信框架(RPC),在美团点评内部广泛使用,是美团点评最基础的底层框架之一. 主 ...

  5. 【c++ primer, 5e】函数匹配

    练习 6.49 候选函数:与所调用的函数的名字相同的函数的集合. 可行函数:给候选函数加上参数数量.参数类型的约束所得到的函数的集合. 6.50 a 3.4可行,二义匹配 b 2.4可行,2是最佳匹配 ...

  6. win10 安装 tensorflow 并运行helloworld

    win10 安装 tensorflow 并运行helloworld   折腾了一下,在win10上成功安装tensorflow. 1 下载安装python,注意一定要是64位(比如python-3.5 ...

  7. 分析Ubuntu18.04启动后的各种任务

    jello@jello:~$ ps -A  PID TTY          TIME CMD    1 ?        00:00:02 systemd    由idle进程(进程号为0的进程,那 ...

  8. [CF1042F]Leaf Sets

    题意:给定一棵$n$个点的树,将叶子节点分为数个集合使集合里点对最长距离不超过$k$,求最少集合数.($n\le1000000$) 首先我们可以想到,这道题并不是让你构造最优方案,因为只要把所有叶子节 ...

  9. 从零开始玩转JMX(二)——Condition

    Notification 一个MBean提供的管理接口允许代理对其管理资源进行控制和配置.然而,对管理复杂的分布式系统来说,这些接口知识提供了一部分功能.通常,管理应用程序需要对状态变化或者当特别情况 ...

  10. How To Use Coordinates To Extract Sequences In Fasta File

    [1] bedtools (https://github.com/arq5x/bedtools2) here is also bedtools (https://github.com/arq5x/be ...