树的操作—c语言实现

前言

  本文包含二叉树、二叉查找树、Av树等的定义和相关操作,由于部分记录在印象笔记中,给出了文章链接。

一.树的遍历

  遍历树形目录,先序遍历和后序遍历分别实现打印目录结构和统计目录下文件个数。先根遍历、后根遍历

二.BST定义及其基本操作

  印象笔记链接

二.AvTree定义及其基本操作
1.简介

  AvTree是BST的一种,但是其每个节点的左子树和右子树的高度最多差1
  BST:对于其每一个节点X,其左子树所有节点关键字值小于x关键字值,右子树反之。
  相对于BST,AvTree的节点多了Height值。所谓树的高度即根的高:根到任意一个树叶的最长路径长,其节点声明如下:

struct AvlNode;
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;

struct AvlNode{
    int ele;
    int height;
    AvlTree Left;
    AvlTree Right;
}
2.基本操作

  1)左单旋和右单旋是对称操作,左单旋针对height(left)-height(right)==2的部分情况,代码如下;

Position SingleRotateWithLeft(Position k2){
    Position K1;    
    K1=K2->Left;

    K2->Left=K1->Right;
    K1->Right=K2;

    K2->height=Max(Height(K2->Left),Height(K2->Right)+1);
    K1->height=Max(Height(K1->Left),Height(K1->Right)+1);
}

大致分为三步:
1. 临时节点赋值;
2. 使用临时节点旋转;
3. 更新临时节点和旋转接点的高度值;

  2)某个节点的左双旋转即,首先将此节点左节点进行右单旋转,然后将此节点进行左单旋转。代码如下:

Position DoubleRotateWithLeft(Position K3){
    K3->Left=SingleRotateWithRight(k3->Left);

    return SingleRotateWithLeft(K3);
}

  3)完整示例如下:

#include <stdio.h>
#include <stdlib.h>

struct AvlNode;
typedef struct AvlNode *Position;
typedef struct AvlNode *AvlTree;

AvlTree Insert(int x,AvlTree T);
Position SingleRotateWithLeft(Position K2);
Position SingleRotateWithRight(Position K2);
Position DoubleRotateWithLeft(Position K3);
Position DoubleRotateWithRight(Position K3);

//AvlTree Delete(int x,AvlTree T);
void printTree(AvlTree T);

int Height(AvlTree t);
int Max(int a,int b);

struct AvlNode{
    int ele;
    int height;
    AvlTree Left;
    AvlTree Right;
};

int main()
{
    AvlTree t=NULL;
    int i=0;
    int a[10]={1,2,3,4,5,6,7,8,9,10};

    for(i=0;i<10;i++){
        t=Insert(a[i],t);
        printTree(t);
        printf("==========\n");
    }

    return 0;
}

int Height(AvlTree t){
    if(t==NULL)
        return -1;
    return t->height;
}

Position SingleRotateWithLeft(Position K2){
    Position K1;
    K1=K2->Left;

    K2->Left=K1->Right;
    K1->Right=K2;

    K2->height=Max(Height(K2->Left),Height(K2->Right))+1;
    K1->height=Max(Height(K1->Left),Height(K1->Right))+1;

    return K1;
}

Position SingleRotateWithRight(Position K2){
    Position K1;
    K1=K2->Right;

    K2->Right=K1->Left;
    K1->Left=K2;

    K2->height=Max(Height(K2->Left),Height(K2->Right))+1;
    K1->height=Max(Height(K1->Left),Height(K1->Right))+1;

    return K1;
}

Position DoubleRotateWithLeft(Position K3){
    K3->Left=SingleRotateWithRight(K3->Left);

    return SingleRotateWithLeft(K3);
}

Position DoubleRotateWithRight(Position K3){
    K3->Right=SingleRotateWithLeft(K3->Right);

    return SingleRotateWithRight(K3);
}

//打印
void printTree(AvlTree t){
    int i;
    if(t==NULL) return;

    for(i=0;i<t->height;i++){
        printf("x");
    }
    printf("%d\n",t->ele);

    printTree(t->Left);
    printTree(t->Right);
}

AvlTree Insert(int x,AvlTree t){
    if(t==NULL){
        t=malloc(sizeof(struct AvlNode));
        t->ele=x;
        t->height=0;
        t->Left=t->Right=NULL;
    }
    else if(x<t->ele){
        t->Left=Insert(x,t->Left);
        if((Height(t->Left)-Height(t->Right))==2){
            if(x<t->Left->ele)
                t=SingleRotateWithLeft(t);
            else
                t=DoubleRotateWithLeft(t);
        }
    }
    else if(x>t->ele){
        t->Right=Insert(x,t->Right);
        if((Height(t->Right)-Height(t->Left))==2){
            if(x>t->Right->ele)
                t=SingleRotateWithRight(t);
            else
                t=DoubleRotateWithRight(t);
        }
    }

    t->height=Max(Height(t->Left),Height(t->Right))+1;

    return t;
}

int Max(int a,int b){
    if(a>b)
        return a;

    return b;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值