1. 非递归先序遍历

    •   

      // 输出, 遍历左子树,遍历右子树
      void firstOrder(Node* root)
      {
      stack<Node*> leftNodes;
      Node* curr = root; // deal each node
      while(curr != NULL && !leftNodes.empty())
      {
      // deal with left subtree
      while(curr != NULL)
      {
      cout << curr -> data << " ";
      // store curr node for reading right subtree
      leftNodes.push(curr);
      curr = curr -> left;
      } // deal with right subtree
      if(!leftNodes.empty())
      {
      curr = leftNodes.top();
      leftNodes.pop(); curr = curr -> right;
      }
      }
      }
  2. 非递归中序遍历
    • // 输出, 遍历左子树,遍历右子树
      void middleOrder(Node* root)
      {
      stack<Node*> leftNodes;
      Node* curr = root; // deal each node
      while(curr != NULL && !leftNodes.empty())
      {
      // deal with left subtree
      while(curr != NULL)
      {
      // store curr node for reading right subtree
      leftNodes.push(curr);
      curr = curr -> left;
      } // deal with right subtree
      if(!leftNodes.empty())
      {
      curr = leftNodes.top();
      leftNodes.pop();
      // cout curr node
      cout << curr -> data << " "; curr = curr -> right;
      }
      }
      }

        

  3. 非递归后序遍历
    • // 输出, 遍历左子树,遍历右子树
      void lastOrder(Node* root)
      {
      stack<Node*> leftNodes;
      stack<bool> tags;
      bool curr_tag = true;
      Node* curr = root; // deal each node
      while(curr != NULL && !leftNodes.empty())
      {
      // deal with left subtree
      while(curr != NULL)
      {
      // store curr node for reading right subtree
      leftNodes.push(curr); // mark have not seen right nodes
      tags.push(false);
      curr = curr -> left;
      } // deal with right subtree
      if(!leftNodes.empty())
      {
      curr = leftNodes.top();
      curr_tag = tags.top();
      tags.pop(); if(curr_tag)
      {
      cout << curr -> data << " ";
      leftNodes.pop();
      // have already dealt right subtree
      p = NULL;
      }
      else
      {
      curr = curr -> right;
      // mark has dealt with rightsubtree
      tags.push(true);
      }
      }
      }
      }
  4. 二叉排序树:左<父<右
  5. 哈弗曼树
    • 哈夫曼编码:带权路径最短
    • 构建方法:从最远端构建
  6. 平衡二叉(搜索)树:每个节点的左右子树深度差的绝对值小于等于1。
    • 一种实现:红黑树
    • 基本失衡情况:左左(右旋),右右(左旋),左右,右左。
  7. 红黑树
    • 节点:红色或黑色。根节点:黑色。叶节点:黑色。红色节点的孩子为黑色。根节点到其每个叶子节点的所有路径包含相同数目的黑色节点。
    • 等待补充
  8. 完全二叉树和满二叉树
    • 完全二叉树,集中在左边
    • 满二叉树,没有叶子节点

C/C++程序基础 (八)数据结构的更多相关文章

  1. Java基础八--构造函数

    Java基础八--构造函数 一.子父类中构造函数的特点 1.1 为什么在子类构造对象时,发现,访问子类构造函数时,父类也运行了呢? 原因是:在子类的构造函数中第一行有一个默认的隐式语句. super( ...

  2. JAVA并行程序基础

    JAVA并行程序基础 一.有关线程你必须知道的事 进程与线程 在等待面向线程设计的计算机结构中,进程是线程的容器.我们都知道,程序是对于指令.数据及其组织形式的描述,而进程是程序的实体. 线程是轻量级 ...

  3. PHP 程序员学数据结构与算法之《栈》

    “要成高手,必练此功”.   要成为优秀的程序员,数据结构和算法是必修的内容.而现在的Web程序员使用传统算法和数据结构都比较少,因为很多算法都是包装好的,不用我们去操心具体的实现细节,如PHP的取栈 ...

  4. Bootstrap <基础八>图片

    Bootstrap 提供了三个可对图片应用简单样式的 class: .img-rounded:添加 border-radius:6px 来获得图片圆角. .img-circle:添加 border-r ...

  5. Java语言基础(八)

    Java语言基础(八) 一.数学运算  + - * /  % (1)凡是byte  short  char类型都按int类型的计算   看看上面的代码,为什么出错! 我已经将100转成byte类型,( ...

  6. ROS_Kinetic_12 ROS程序基础Eclipse_C++(三)usb camera

    ROS_Kinetic_12 ROS程序基础Eclipse_C++(三)usb camera 软件包下载地址:https://github.com/bosch-ros-pkg/usb_cam 下载后, ...

  7. ROS_Kinetic_11 ROS程序基础Eclipse_C++(二)

    ROS_Kinetic_11 ROS程序基础Eclipse_C++(二) 编写简单的Service和Client (C++): http://wiki.ros.org/cn/ROS/Tutorials ...

  8. ROS_Kinetic_10 ROS程序基础Eclipse_C++(一)

    ROS_Kinetic_10 ROS程序基础Eclipse_C++(一) 编写简单的消息发布器和订阅器 (C++) http://wiki.ros.org/cn/ROS/Tutorials/Writi ...

  9. Java并发程序设计(二)Java并行程序基础

    Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师链接:https://www.zhihu.com/question/27654579/answer/1 ...

  10. 微信小程序基础

    前言 什么是微信小程序,它是一种轻量级的APP,它与常规App来说,无需下载安装即可使用,它嵌于微信App中,要使用微信小程序你只需要搜索一下微信小程序的名称就好,如近期的"Google的画 ...

随机推荐

  1. 牛客假日团队赛1B.便便传送门(一)

    链接:https://ac.nowcoder.com/acm/contest/918/B 题意: Farmer John最讨厌的农活是运输牛粪.为了精简这个过程,他制造了一个伟大的发明:便便传送门!与 ...

  2. UVa 10256(凸包、线段交、点在多边形内)

    要点 红蓝点分别求凸包显然 判断两凸包是否相交方法:所有红点不在蓝凸包内,反之亦然:所有红凸包线不与蓝凸包线相交,反之亦然. 书上让特判一下凸包退化成点或线段的情况,为什么我感觉代码仓库的代码并没特判 ...

  3. JS——通过标签获取元素、循环语句、数组去重

    通过标签获取元素: var aLi = document.getElementsByTagName('Li'); aLi[0].style.backgroundColor = 'gold'; 选中部分 ...

  4. PHP拾贝

    $_SERVER['DOCUMENT_ROOT']指向了web服务器文档树的根.(E:/wamp/www/) ********************************************* ...

  5. 设置VS代码模板

    本文URL:http://www.cnblogs.com/CUIT-DX037/p/6770366.html 打开VS安装目录下:\Microsoft Visual Studio 12.0\Commo ...

  6. linux cached过高导致性能变低

    场景: 拿到了客户50个文件,平均每个文件大概40M左右的txt,文件在S3上,需要导入到数据库,40M解析出来大概是80W条左右的数据. 描述: 在刚开始执行导入时,因为数据验证复杂程度不同,每个文 ...

  7. webpack实用小功能介绍

    1.overlay overlay属于devServer的属性,配置案例如下: ? 1 2 3 4 5 6 devServer: {  overlay: {   errors: true,   war ...

  8. MongoDB 3.2 在CentOS 上的安装和配置

    MongoDB 3.2 在CentOS 上的安装和配置   2016-01-06 14:41:41 发布 您的评价:       0.0   收藏     0收藏 一.安装 编辑/etc/yum.re ...

  9. spring mvc 文件下载 get请求解决中文乱码问题

    方案简写,自己或有些基础的可以看懂,因为没时间写的那么详细 方案1 spring mvc解决get请求中文乱码问题, 在tamcat中server.xml文件 URIEncoding="UT ...

  10. 内置函数isNaN()

    NaN(not a number)的产生:算术运算返回一个未定义的或无法表示的值 1.NaN并不一定用于表示某些值超出表示范围的情况.将某些不能强制转换为数值的非数值转换为数值的时候,也会得到NaN. ...