《大话数据结构》第六章 树

ADT 树
Operation:
InitTree(*T);
DestroyTree(*T);
CreateTree(*T,definition);
ClearTree(*T);
TreeEmpty(T);
TreeDepth(T);
Root(T);
Value(T,cur_e);
Assign(T,cur_e,value);
Parent(T,cur_e);
LeftChild(T,cur_e);
RightSibling(T,cur_e);
InsertChild(*T,*p,i,c);
DeleteChild(*T,*p,i);


双亲表示法
这里写图片描述
根节点没有双亲,约定根节点的位置域设置为-1

#define Max_Tree_Size 100
typedef int TElemType;
typedef struct PTNode{
    TElemType data;
    int parent;
}PTNode;
typedef struct PTree{
    PTNode nodes[Max_Tree_Size];
    int r,n;    //根的位置和节点数 
}; 
//根节点没有双亲,约定根节点的位置域设置为-1

孩子表示法
这里写图片描述
这里写图片描述

#define Max_Tree_Size 100
typedef struct CTNode{
    int child;
    struct CTNode *next;
}*ChildPtr;
typedef struct CTBox{
    TElemType data;
    ChildPtr firstchild;
}CTBox;
typedef struct CTree{
    CTBox node[Max_Tree_Size];
    int r,n;//根的位置和节点数
}CTree;

双亲孩子表示法
这里写图片描述

#define Max_Tree_Size 100
typedef struct PCTNode{
    int child;
    struct PCTNode *next;
}*ChildPtr; 
typedef struct PCTBox{
    TElemType data;
    int parent;
    ChildPtr firstchild;
};
typedef struct PCTree{
    PCTBox nodes[Max_Tree_Size];
    int n,r;
}PCTree;

孩子兄弟表示法
这里写图片描述
这里写图片描述
想找双亲,完全可以增加一个parent指针域

/*孩子兄弟表示法*/
typedef struct CSNode{
    TElemType data;
    struct CSNode *firstchild, *rightsib;
}CSNode, *CSTree; 
//想找双亲,完全可以增加一个parent指针域
/* struct CSNode *parent;*/

特殊的二叉树:斜树、满树、完全二叉树
斜树特点

满二叉树特点

完全二叉树特点


二叉树的存储结构
1.顺序存储结构
顺序存储结构

2.二叉链表
二叉链表

这里写图片描述

typedef struct BiTNode{
    TElemType data;
    struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

遍历二叉树
1.前序遍历
这里写图片描述

void PreOrderTraverse(BiTree T){
    if(T==NULL)
        return;
    printf("%c",T->data);
    PreOrderTraverse(T->lchild);
    PreOrderTraverse(T->rchild);
} 

2.中序遍历
这里写图片描述

void InOrderTraverse(BiTree T){
    if(T==NULL)
        return;
    InOrderTraverse(T->lchild);
    printf("%c",T->data);
    InOrderTraverse(T->rchild);
} 

3.后序遍历
这里写图片描述

void PostOrderTraverse(BiTree T){
    if(T==NULL)
        return;
    PostOrderTraverse(T->lchild);
    PostOrderTraverse(T->rchild);
    printf("%c",T->data);
} 

二叉树的建立
这里写图片描述
前序遍历

void CreateBiTree(BiTree *T){
    TElemType ch;
    scanf("%c", &ch);
    if(ch=='#') 
        *T=NULL;
    else{
        *T=(BiTree)malloc(sizeof(BiTNode));
        if(!T)
            exit(OVERFLOW);
        (*T)->data=ch;
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);
    }
}

中序遍历
后序遍历


搜索二叉树
把指向前驱和后继的指针称为线索,加上线索的二叉链表成为搜索链表,相应的二叉树成为搜索二叉树
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

/*二叉树的二叉搜索存储结构定义*/
typedef enum {Link,  Thread} PointerTag;
typedef struct BiThrNode{
    TElemType data;
    struct BiThrNode *lchild, *rchild;
    PointerTag LTag;
    PointerTag RTag;
}BiThrNode *BiThrTree;

/*中序遍历搜索化的递归函数代码*/
BiThrTree pre;  
void InThreading(BiThrTree p){
    if(p){
        InThreading(p->lchild);
        if(!p->lchild){
            p->LTag = Thread;
            p->lchild = pre;    
        }
        if(!pre->rchild){
            pre->RTag=Thread;
            pre->lchild=p;
        }
        pre=p;
        InTreading(p->rchild);
    }
} 

/*遍历代码如下*/
/*T指向头结点,头结点左链lchild指向根节点,头结点右链rchild指向中序遍历的最后一个节点*/
Status InOrderTraverse_Thr(BiThrTree T){
    BiThrTree p;
    p = T->lchild;
    while(p!=T) 
    {
        while(p->LTag==Link)
            p=p->lchild;

        printf("%c", p->data);
        while(p->RTag==Thread && p->rchild!=T){
            p=p->rchild;
            printf("%c", p->data);
        }   
        p=p->rchild;
    } 
    return OK;
} 

树、森林、二叉树之间的转换
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述


树和森林的遍历
树的遍历:先根遍历、后根遍历
森林的遍历:前序遍历、后续遍历

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值