数据结构 第5章 树的二叉树 单元小结(2)遍历二叉树和线索二叉树

概念:

遍历二叉树:

遍历:指按某条搜索路线遍访每个结点且不重复(又称周游)。

遍历的用途:它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。

时间效率: O(n) //每个结点最多访问两次

空间效率: O(n) //栈占用的最大辅助空间

用栈进行迭代运算 和队列很像

先序:                    中序:

void PreOrderlteration(BiTree T)            void InOrderIteration(BiTree T)

{  stack<BiTree> s;              stack<BiTree> s;

  BiTree p;                  BiTree p = T;

  if(T!=NULL) s.push(T);            while(p!=NULL || !s.empty()){

  while(!s.empty()){               while(p!=NULL){//一直走到左尽头

    p=s.top();                  s.push(p);//根节点进栈

    s.pop();                   p==p->lchild;//遍历左子树}

    cout<<p->data<<" ";             p = s.top();//左已访问右未访问

    if(p->rchild!=NULL) s.push(p->rchild);     s.pop();

    if(p->lchild!=NULL) s.push(p->lchild);      cout<<p->data<<" ";

}                          p=p->rchild;//准备遍历右子树

复制二叉树:                      计算二叉树的深度

void Copy(BiTree T, BiTree &NewT)              int Depth(BiTree T){

{//先序复制二叉树                      //返回二叉树的深度

if (T==NULL) { NewT = NULL; return; } //递归结束,建空树 if(T==NULL) return 0;//空树,深度为0

else {                        else{

NewT = new BiTNode;                  m=Depth(T->lchild);

NewT->data = T->data ; //复制根结点            n=Depth(T->rchild);

Copy(T->lchild, NewT->Lchild); //复制左子树        if(m>n) return(m+1);

Copy(T->rchild, NewT->rchild); //复制右子树 }         else return(n+1);}

}

计算二叉树结点总数:

int NodeCount(BiTree T)

{

if(T==NULL) return 0;

else return NodeCount(T->lchild) +NodeCount(T->rchild)+1;

}

原文地址:https://www.cnblogs.com/snowlxy/p/10808726.html

时间: 2024-11-05 13:44:24

数据结构 第5章 树的二叉树 单元小结(2)遍历二叉树和线索二叉树的相关文章

数据结构——第三章树和二叉树:02二叉树

1.二叉树的存储结构: (1)二叉树的顺序存储表示: #define MAX_TREE_SIZE 100 //二叉树的最大结点数 typedef TElemType SqBiTree[MAX_TREE_SIZE]; SqBiTree bt; (2)二叉树的链式存储表示: ①二叉链表: typedef struct BiTNode //结点结构 { TElemType data; struct BiTNode *lchild, *rchild; //左右孩子指针 } BiTNode, *BiTre

数据结构——第三章树和二叉树:03树和森林

1.树的三种存储结构: (1)双亲表示法: #define MAX_TREE_SIZE 100 结点结构: typedef struct PTNode { Elem data; int parent; //双亲位置域 } PTNode; (2)孩子双亲链表表示法: typedef struct PTNode { Elem data; int parent; //双亲位置域 struct CTNode* nextchild; } *ChildPtr; (3)树的二叉链表(孩子-兄弟)存储表示法:

c++智能指针和二叉树(1): 图解层序遍历和逐层打印二叉树

二叉树是极为常见的数据结构,关于如何遍历其中元素的文章更是数不胜数. 然而大多数文章都是讲解的前序/中序/后序遍历,有关逐层打印元素的文章并不多,已有文章的讲解也较为晦涩读起来不得要领.本文将用形象的图片加上清晰的代码帮助你理解层序遍历的实现,同时我们使用现代c++提供的智能指针来简化树形数据结构的资源管理. 那么现在让我们进入正题. 使用智能指针构建二叉树 我们这里所要实现的是一个简单地模拟了二叉搜索树的二叉树,提供符合二叉搜索树的要求的插入功能个中序遍历.同时我们使用shared_ptr来管

数据结构-王道2017-第4章 树与二叉树-树、森林

1.树的存储结构有多种,既可以采用顺序存储结构,也可以采用链式存储结构,都要求能唯一地反映出树中各结点之间的逻辑关系,三种常用的存储结构 1)双亲表示法 采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲节点在数组中的位置,根节点下标为0,其伪指针域为-1. #define MAX_TREE_SIZE 100 //树中最多结点数 typedef struct{ //树的结点定义 ElemType data; //数据元素 int parent; //双亲位置域 }PTNo

数据结构-王道2017-第4章 树与二叉树-二叉树的遍历

typedef int ElemType; typedef struct BitNode { ElemType data; //数据域 struct BitNode *lchild, *rchild; //左右孩子指针 }BitNode,*BitTree; void visit(BitNode *b) { printf("%d ", b->data); } //无论采用哪种遍历方法,时间复杂度都是O(n),因为每个结点都访问一次且仅访问一次,递归工作栈的栈深恰好为树的深度,空间复

数据结构——第五章 树与二叉树

树是一对多的结构 结点:树的小圆圈 度:结点有多少个分叉 叶子结点:结点的度为0 双亲:parent 孩子:child 二叉树:树的度不超过2 满二叉树:每一层都是满的 完全二叉树:除了最后一层都是满的,最后一层左边都是齐全连续的. 性质1:对一颗二叉树,第i层最多有2的i-1次方个 性质2:对一颗二叉树,最多有2的i次方-1个 性质3:n0=n2+1 n0+n1+n2=n(n0--结点度为0的个数,n2--结点度为2的个数) 性质4:具有n个结点的完全二叉树深度为 math.floor(log

数据结构——第三章树和二叉树:01树和二叉树的类型定义

1.树的类型定义: (1)数据对象D:D是具有相同特性的数据元素的集合. (2)数据关系R:若D为空集,则成为空树 否则:在D中存在唯一的称为根的数据元素root.当n>1时,其余结点可分为n(n>0)个互不相交的有限集T1, T2, T3, ..., Tm,其中每一棵子集本身又是一课符合本定义的树,称为根root的子树. 2.树的基本操作: (1)查找类: ①Root(T):求树的根结点 ②Value(T, cur_e):求当前结点的元素值 ③Parent(T, cur_e):求当前结点的双

数据结构学习之第7章 树和二叉树

数据结构学习之第7章 树和二叉树 0x7.1.1 树的基本概念 ?1.树的定义 ? 树是由n(n>=0)个结点(或元素)组成的有限集合(记为T) ? 如果n>0,这n个结点中有且仅有一个结点作为树的根结点,简称为根,其余结点可分为m(m>=0)个互不相交的有限集\[T_{1}T_{2}\cdots T_{m}\],其中每个子集又是一棵符合定义的子树,称为根结点的子树. 知识点:由树的定义我们可以看出来树的结构是递归的 ?2.树的逻辑表示法 ? 1.树形表示法 ? 2.文氏图表示法 ? 3

数据结构期末复习第六章树和二叉树

知识点: 先序遍历二叉树规则:根-左-右 1.访问根结点 2.先序遍历左子树 3.先序遍历右子树 中序遍历二叉树规则:左-根-右 1.先中序遍历左子树 2.再访问根节点 3.最后访问中序遍历右子树 后序遍历二叉树规则:左-右-根 1.后序遍历左子树 2.后序遍历右子树 3.访问根结点 1.  一棵二叉树的先序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历结果为(A)A. CBEFDA                       B. FEDCBAC. CBEDFA