目录

  • 1 课程资料
    • 1.1 课程标准
    • 1.2 教学日历
    • 1.3 说课课件
  • 2 第一章绪论
    • 2.1 本章教学目标
    • 2.2 数据结构简介
    • 2.3 数据结构类型
    • 2.4 算法分析
    • 2.5 本章讲义
    • 2.6 本章测验题
    • 2.7 测验
  • 3 线性结构
    • 3.1 本章教学目标
    • 3.2 线性表
    • 3.3 线性表的顺序存储及运算实现
      • 3.3.1 本节讲义
    • 3.4 线性表的链式存储和 运算实现
      • 3.4.1 本节讲义
    • 3.5 应用
    • 3.6 数组
      • 3.6.1 讲义
    • 3.7 本章测验题
    • 3.8 测验
    • 3.9 作业
  • 4 第三章栈和队列
    • 4.1 本章教学目标
    • 4.2 第一课时栈
      • 4.2.1 讲义
    • 4.3 第二课时队列
      • 4.3.1 讲义
    • 4.4 应用
      • 4.4.1 讲义
    • 4.5 本章测验题
  • 5 第四章串
    • 5.1 第一课时概念
    • 5.2 本章学习目标
    • 5.3 本章测验题
  • 6 第五章树和二叉树
    • 6.1 本章学习目标
    • 6.2 第一课时树的定义及基本术语
    • 6.3 第二课时二叉树定义性质存储
    • 6.4 第三课时二叉树遍历
    • 6.5 第四二叉排序与平衡二叉树
    • 6.6 第五树森林二叉树之间转换
    • 6.7 第六课时哈夫曼树
    • 6.8 本章测验题
    • 6.9 测验
    • 6.10 作业
  • 7 第六章图
    • 7.1 本章学习目标
    • 7.2 第一课时图的基本概念
    • 7.3 第二课时图的存储
    • 7.4 第三课时图的遍历
    • 7.5 第四课时最小生成树
    • 7.6 第五课时最短路径
    • 7.7 第六课时拓扑排序
    • 7.8 第七课时关键路程
    • 7.9 本章测验题
    • 7.10 测验
    • 7.11 作业
  • 8 第七章查找
    • 8.1 本章学习目标
    • 8.2 第一课时顺序查找二分查找
    • 8.3 第二课时哈希表
    • 8.4 本章测验题
    • 8.5 测验
    • 8.6 作业
  • 9 第八章排序
    • 9.1 本章学习目标
    • 9.2 第一课时基本概念
    • 9.3 第二课时插入选择排序
    • 9.4 第三课时交换排序
    • 9.5 第四课时归并 基排序及比较
    • 9.6 本章测验题
    • 9.7 测验
    • 9.8 作业
第二课时二叉树定义性质存储

掌握二叉树的类型定义和性质

6.2       

6.2.1   二叉树的定义

二叉树(Binary Tree):和树不同的树型结构

1 每个结点的度都不大于2

2 有序树:每个结点的孩子结点次序不能任意颠倒     

二叉树的重要特性

性质1: 在二叉树的第i层上至多有2i-1个结点(i1) 

性质2: 深度为k的二叉树至多有2k-1个结点(k1

性质3: 对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0=n2+1

性质4具有n个结点的完全二叉树的深度为  log2n  +1

性质5:  对于具有n个结点的完全二叉树, 如果按照从上到下和从左到右的顺序对二叉树中的所有结点从1开始顺序编号, 则对于任意的序号为i的结点有:

满二叉树: 深度为k且有2k-1个结点的二叉树。在满二叉树中,每层结点都是满的,即每层结点都具有最大结点数。 

完全二叉树: 深度为k,结点数为n的二叉树,如果其结点1~n的位置序号分别与满二叉树的结点1~n的位置序号一一对应,则为完全二叉树。 

6.3顺序存储结构 

链式存储结构

 对于任意的二叉树来说,每个结点只有两个孩子,一个双亲结点。我们可以设计每个结点至少包括三个域:数据域、 左孩子域和右孩子: 

6.3二叉树的遍历

先序遍历(DLR)操作过程:

若二叉树为空, 则空操作, 否则依次执行如下3个操作:

² 访问根结点;

² 按先序遍历左子树;

² 按先序遍历右子树。 

中序遍历(LDR)操作过程:

   若二叉树为空, 则空操作, 否则依次执行如下3个操作: 

² 按中序遍历左子树;

² 访问根结点;

² 按中序遍历右子树。

后序遍历(LRD)操作过程:

   若二叉树为空, 则空操作, 否则依次执行如下3个操作: 

² 按后序遍历左子树;

² 按后序遍历右子树;

² 访问根结点。 

VoidPreorder(BiTreeT, void( *visit)(TElemType& e))

{ // 先序遍历二叉树 

   if (T) {

      visit(T->data);            // 访问结点

      Preorder(T->lchild, visit); // 遍历左子树

      Preorder(T->rchild, visit);// 遍历右子树

   }

}

BiTNode *GoFarLeft(BiTree T, Stack *S){

   if (!T )  return NULL;

   while (T->lchild ){

      Push(S, T);

      T = T->lchild;

   }

   return T;

}

voidInorder_I(BiTreeT,void(*visit)                                  (TelemType& e)){

   Stack *S;

   t = GoFarLeft(T, S);  // 找到最左下的结点

   while(t){

      visit(t->data);

      if (t->rchild)

         t = GoFarLeft(t->rchild, S);

     else if ( !StackEmpty(S ))    // 栈不空时退栈

        t = Pop(S);

              else    t = NULL; // 栈空表明遍历结束

    } // while

}// Inorder_I