首页 > 其他 > 详细

数据结构-第5章学习小结

时间:2020-05-23 15:41:44      阅读:82      评论:0      收藏:0      [点我收藏+]

第五章小结

一、知识框架(如图)

技术分享图片

 

二、二叉树重点掌握算法

1. 先序遍历的递归算法

技术分享图片
void PreOrderTraverse(BiTree T) 
{ // 先序遍历二叉树
   if(T)
   { 
       cout << T -> data; //访问根结点 
       PreOrderTraverse(T->lchild); // 遍历左子树 
       PreOrderTraverse(T->rchild); //遍历右子树 
   } 
}
先序遍历

2.中序遍历、后序遍历与先序遍历相似(顺序不同)

  先序:根左右; 中序:左根右 ;后序:左右根

3. 先序建立二叉链表

技术分享图片
void CreateBiTree(BiTree &T)
 {//根据读入的先序字符序列,建立二叉树 
    cin>>ch; 
    if(ch==#) T = NULL; //递归结束,建空树 
    else 
   { 
        T = new BiTNode; 
        T->data = ch; //生成树(子树)的根结点 
        CreateBiTree(T->lchild); //递归创建左子树 
        CreateBiTree(T->rchild); //递归创建右子树 
    }
 }
先序建立二叉链表

4. 先序复制二叉树

技术分享图片
void Copy(BiTree T, BiTree &NewT
{//先序复制二叉树 
    if (T==NULL)
   { 
       NewT = NULL; 
       return;
   } //递归结束,建空树 
   else 
   { 
       NewT = new BiTNode;
       NewT->data = T->data ; //复制根结点 
      Copy(T->lchild, NewT->Lchild); //复制左子树 
      Copy(T->rchild, NewT->rchild); //复制右子树 
   }
}
先序复制二叉树

5. 计算二叉树深度

技术分享图片
int Depth(BiTree T) 
{ // 返回二叉树的深度 
   if(T==NULL) return 0; //空树,故深度为0 
   else 
  { 
       DepthLeft = Depth(T->lchild); //递归计算左子树的深度
       DepthRight = Depth(T->rchild);// 递归计算右子树的深度
       return (1+max(DepthLeft,DepthRight)); //左右子树中深度大的+1则为二叉树的深度 
   } 
}
返回二叉树的深度

6.计算二叉树结点总数

技术分享图片
int NodeCount(BiTree T)
{ //结点个数为左子树的结点个数+右子树的 结点个数再+1。
    if(T==NULL) return 0;
    else return NodeCount(T->lchild) +NodeCount(T->rchild)+1; 
}
计算二叉树结点总数

7.按层次顺序遍历二叉树,输出每个结点的 data 值。【层次遍历过程中采用的辅助数据结构是队列,利用其先进先出的特点来进行层次遍历】

技术分享图片
typedef struct biTNode
{ 
    TElemType data; 
    struct biTNode *lchild;
    struct biTNode *rchild; 
}BiTNode, *BiTree; //链式二叉树结构体类型

void fun(BiTree T) 
{ //层次遍历输出二叉树
    queue<BiTNode *> q;//指向BiTNode类型的指针队列
    q.push(T);//T指针入队
    BiTNode *p; //辅助变量
    while (!q.empty()) 
   { //q非空则继续访问队列
        p = q.front(); //取队头
        q.pop(); //出队
        if (p!=NULL)
       { 
            cout << p->data;//输出结点data
            q.push(p->lchild);//左孩子入队
            q.push(p->rchild); //右孩子入队
       } 
    } 
}
层次遍历

 

三、哈夫曼树

1.结点类型定义:

typedef struct { 
    int weight; //权值
   int parent, lch, rch;
 } *HuffmanTree;

2.例子

技术分享图片

 

四、二叉搜索树

1. 二叉搜索树的定义、查找、插入和删除

https://blog.csdn.net/yanxiaolx/article/details/51986428

 

五、易错点

1. typedef TElemType SqBiTree[MAXTSIZE];

// 定义了一个新类型,名字为 SqBiTree,其本质是一个数组,数组元素类型是 TElemType,长度为 MAXTSIZE

如:int a[100]; int b[100] <---> typedef int Num[100] ; Num a,b;

 
2.int n; cin >>n ; int *a = new int [n] ;//在堆申请空间,长度为 n的int类型数组,语法正确 (人工分配,人工回收)
  int n; cin >> n; int a[n] ; // 定义数组时,数组长度为变量,C 语言正确,但 C++不支持!(如果可以申请是在栈空间申请)
 
3.已知二叉树先序序列、中序序列,求后序序列 或 已知二叉树后序序列、中序序列,求先序序列
tips :由先序序列可知第一个(由后序序列可知最后一个)为根结点,由中序序列(根结点必在中间)可区分根结点左右子树
eg.若二叉树先序序列:ACBEHDGF,中序序列:BCHEAGFD。则后序序列是?//BHECFGDA 
-----> 由先序可知,A 是根结点,再由中序可知,BCHE 是左子树,GFD 是右子树;由先序可知,C 是左子树的根结点,再由中序可知,C 的左孩子为 B,C 的右子树是 HE..... 
 
 
 
 
 
 
 
 

数据结构-第5章学习小结

原文:https://www.cnblogs.com/Madge/p/12942483.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!