数据结构(2)

  1. 二叉树的遍历

(1)先序遍历(根,左,右)

#include  <stdio.h>
int main()
{void PreOrderTraversal(BinTree BT)
{
     if (BT)  {
         printf("%d",BT->DATA);
         PreOrderTravelsal(BT->Left);
         PreOrderTravelsal(BT->Right);
              })

(2)中序遍历(左,根,右)

#include  <stdio.h>
int main()
{void InOrderTraversal(BinTree BT)
{
     if (BT)  {
         InOrderTraversal(BT->Left)
         printf("%d",BT->DATA);
         InOrderTraversal(BT->Right)
              })

(3)后序遍历( 左,右,根)

#include  <stdio.h>
int main()
{void POSTOrderTraversal(BinTree BT)
{
     if (BT)  {
         printf("%d",BT->DATA);
         POSTOrderTravelsal(BT->Left);
         POSTOrderTravelsal(BT->Right);
              })
  1. 二叉搜索树

  1. 特别函数

Postion Find (ElementType X,BinTree BST)从二叉搜索树中查找元素X,返回其所在节点的地址

Postion FindMin(BinTree BST) 从二叉搜索树中查找并返回最小元素所在的节点地址

Postion FindMax(BinTree BST) 从二叉搜索树中查找并返回最大元素所在的节点地址

Bin Tree Insert(Element Type X,BinTree)

BinTree Delete (ElementType X,BinTree)

  1. 查找

Postion Find (ElementType X,BinTree BST )
    { 
    if(!BST)return NULL;
    if (X>BST -> Data)
        return Find(X, BST->Right);
    Else if (X< BST->Data)
        return Find(X->Left);
    else
        return BST;
    }

迭代函数

Postion IterFind (ElementType X,BinTree BST)
{
    While(BST){
        if(X>BST->Data)
            BST=BST->Right;
        else if (X<BST->Data)
            BST->Left;
        else
           return BST;        
    }
    return NULL;
    }
查找的效率决定于树的高度
  1. 插入

BinTree Insert(ElementType X ,BinTree BST)
{   
    if(!BST)
        BST=malloc(sizeof(struct TreeNode));
        BST->Data=X; 
        BST->Left =BST->Right =NULL;
    }else
         if (X<BST->Data)
             BST->Left=Insert (X, BST->Left);
        else  if (X>BST->Data)
             BST->Right=Insert (X,BST->Right);
    return  BST;        
}
  1. 删除

BinTree Delete (ElementType X, BinTree BST)
{  Postion Tmp;
   if(!BST) printf("要删除的元素未找到")
    else if (X<BST->Data)
         BST->Left=Delete(X,BST->Left);
    else if (X>BST->Data)
         BST->Right=Delete(X,BST->Right);
    else
         if(BST->Left &&BST->Right){
             Tmp=FindMin(BST->Right);
             BST->Data=Tmp->Data;
             BST->Right=Delete(BST->Data,BST->Right)
             }
        else{
            Tmp=BST;
            if(!BST->Left)
                 BST=BST->Right;
            else if (!BST->Right)
                 BST=BST->Left;
        free(Tmp); 
        }
        return BST; 
}
  1. 平衡二叉树

空树或者任一结点左,右子树高度差的绝对值不超过1

3.堆(heap)

1.优先队列, 取出的元素的顺序是依照元素的优先权大小,而不是元素进入队列的先后顺序

2.堆的性质, 结构性,有序性(最大堆 操作集)

MaxHeap Create 创建空堆

Boolean IsFull 判断堆是否已经满了

Insert 将item插入

Boolean IsEmpty 判断堆是否为空

ElementType DeleteMax 返回H中最大元素

  1. 最大堆的创建

typedef struct HeapStruct  *MaxHeap
struct HeapStruct{
    ElementType  *Elements;
    int size;
    int capacity;
    
}; 
MaxHeap Create (int Maxsize){

MaxHeap Heap =malloc(sizeof (struct Heapstruct));
H->Elements =malloc (sizeof (struct HeapStruct));
H->size =0;
H->capacity =Maxsize;
H->Element[0]=MaxDate;
return  H;
}
  1. 算法

void Insert (MaxHeap H, ElementTypee item)
{
    int i;
    if (IsFull(H)){
          printf("最大堆已满")
          return; 
      }
      i= ++H->Size;
    for (;  H->Element[i/2]<item ; i/=2)       
          H->Element [i]  =H->Elements[i/2];
    H->Element[i]=item; 
            
 } 
  1. 最大堆的删除

ElementType DeleteMax(MaxHeap)
{
    int Parent ,child;
    ElementType MaxItem , temp;
    if ( IsEmpty (H))  {
        printf("最大堆已经为空")
        return; 
    }
    MaxItem =H->Element[1]//取出根节点的最大值 
    temp =H->Elements [H->Size--]
    for(Parent=1;Parent*2<=H->Size;Parent=Child)
       Child =Parent*2;
       if((Child!=H->Size)&&
         (H->Elements[Child]<  H->Elements[Child+1]) )
         Child++;//左右子较大的 
       if(temp >=H->Elements[Child]) break;
       else//移动到下一层 
          H->Element[Parent]=H->Elements[Child];
}//给temp找一个位置 
H->Elements[Parent] =temp;
return MaxItem;
 } 

3.哈夫曼树

 typedef struct TrssNode *HuffmanTree;
 struct TreeNode(
   int Weight;
   HuffmanTree Left, Right;
   )
 HuffmanTree Huffman (MinHeap H)
 {
     int i; HuffmanTree T;
     BuildMinHeap (H)
     for (i=1; i< H->Size; i++)
     {
         T=malloc (sizeof (struct  TreeNode));
         T->Left =DeleteMin(H);
         T->Right=DeleMin(H);
         T-Weight =T->Left ->Weight +T ->Right ->Weight ;
         Insert(H,T);
     }
     T=DeleteMin(H)
     return T;
  } 

哈夫曼树的特点 1.没有度为1 的 节点 2. n 个叶子节点的哈夫曼树一共有2n-1个节点

编码 (二义性(前缀码,用二叉树进行编码, )

  1. 集合

int Find (SetType S[] ,ElementType  X)
{
    int i;
    for (i=0;i<MaxSize &&S[i] . Data !=X; i++);
    if (i>=Maxsize) return -1;
    for(;S[i].Parent>=0;i=S[i].Parent);
    return i;
 } 
//堆的表示及操作做
#define MAXH  1001
#define MINH -10001 
int H[MAXN],size;
void  Create()
{
    size=0;
    H[0]=MINH;
 
 } 

1.六度空间理论 表示一种多对多的关系

一定包含一组顶点 边(顶点对 ) 有向便

2.操作集 Graph crteate() 建立并返回空图

Graph InsertVertex(Graph G ,Vertex v)将v插入G

Graph InsertEdge(Graph G,Edge e) 将e插入G

void Dfs (Graph G,Vertex v) 从顶点v出发深度优先遍历图G

void Bfs (Graph G,Vertex v) 从顶点v出发宽度优先遍历图G

void Shortest Path (Graph G,Vertex v,int Dist[]) 计算图G中任意顶点v到其他顶点的最短距离

void MST (Graph G)计算图G的最小生成树

3.*生成图:邻接矩阵 邻接表*/

void DFS (Vertex V)
{
    visited[V] =true;
    for(V 的没个临界点w)
       if(!visited[w]) 
         DFS(w); 
}


void BFS(Vertex V)
{
    visited[V] =ture;
    Enqueue (V,Q);
    while (!IsEmpty(Q)){
        V=Dequeue(Q)
        for (V 的每个邻接点w)
           if (!visited[w]){
               visited[w] =ture;
               Enqueue(W,Q);
           }
    } 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值