Giải thuật và lập trình - C: Solution CÀI ĐẶT CÂY (TREE) bằng mảng

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Link bài học:

https://v1study.com/giai-thuat-va-lap-trinh-c-iii-cai-dat-cay.html

Solution tham khảo:

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

#define MAXLENGTH 100 /* Chỉ số tối đa của mảng */

#define NIL -1

typedef int DataType;

typedef int Node;

typedef struct{

    /* Lưu trữ nhãn (dữ liệu) của nút trong cây */

    DataType Data[MAXLENGTH];

    /* Lưu trữ cha của các nút trong cây theo nguyên tắc: Cha của nút i sẽ lưu ở vị trí i trong mảng */

    Node Parent[MAXLENGTH];

    /* Số nút thực sự trong cây */

    int MaxNode;

} Tree;

Tree T;

///Khởi tạo cây rỗng
void MakeNull_Tree (Tree *T){

    (*T).MaxNode=0;

}

///Kiểm tra cây rỗng
int EmptyTree(Tree T){

    return T.MaxNode == 0;

}

///Xác định nút cha của nút trên cây
Node Parent(Node n,Tree T){

    if (EmptyTree(T) || (n>T.MaxNode-1))

        return NIL;

    else

        return T.Parent[n];

}

///Xác định nhãn của nút trên cây
DataType Label_Node(Node n,Tree T){

    if (!EmptyTree(T) && (n<=T.MaxNode-1))

        return T.Data[n];

}

///Hàm xác định nút gốc trong cây
Node Root(Tree T){

    if (!EmptyTree(T))

        return 0;

     else

        return NIL;

}

///Hàm xác định con trái nhất của một nút
Node LeftMostChild(Node n,Tree T){

    Node i;

    int found;

    if (n<0) return NIL;

    i=n+1;/* Vị trí nút đầu tiên hy vọng là con của nút n */

    found=0;

    while ((i<=T.MaxNode-1) && !found)

        if (T.Parent[i]==n) found=1; /* Đã tìm thấy con trái nhất của nút n */

        else i=i+1;

    if (found) return i;

    else return NIL;

}

///Hàm xác định anh em ruột phải của một nút
Node RightSibling(Node n,Tree T){

    Node i,parent;

    int found;

    if (n<0) return NIL;

    parent=T.Parent[n];

    i=n+1;

    found=0;

    while ((i<=T.MaxNode-1) && !found)

        if (T.Parent[i]==parent) found=1;

        else i=i+1;

    if (found) return i;

    else return NIL;

}

///Thủ tục duyệt tiền tự
void PreOrder(Node n,Tree T){

    Node i;

    printf("%d ",Label_Node(n,T));

    i=LeftMostChild(n,T);

    while (i!=NIL){

        PreOrder(i,T);

        i=RightSibling(i,T);

    }

}

///Thủ tục duyệt trung tự
void InOrder(Node n,Tree T){

    Node i;

    i=LeftMostChild(n,T);

    if (i!=NIL) InOrder(i,T);

    printf("%d ",Label_Node(n,T));

    i=RightSibling(i,T);

    while (i!=NIL){

        InOrder(i,T);

        i=RightSibling(i,T);

    }

}

///Thủ tục duyệt hậu tự
void PostOrder(Node n,Tree T){

    Node i;

    i=LeftMostChild(n,T);

    while (i!=NIL){

        PostOrder(i,T);

        i=RightSibling(i,T);

    }

    printf("%d ",Label_Node(n,T));

}

///Nhập liệu cho cây
void InputTree(Tree *T){

    int i;

    MakeNull_Tree(&*T);

    //Nhập số nút của cây cho đến khi số nút nhập vào là hợp lệ

    do {

        printf("Moi nhap so luong nut cua cay: ");

        scanf("%d",&(*T).MaxNode);

    } while (((*T).MaxNode<1) || ((*T).MaxNode>MAXLENGTH));

    printf("Nhap nhan cua nut goc: ");

    fflush(stdin);

    scanf("%d",&(*T).Data[0]);

    (*T).Parent[0]=NIL; /* nut goc khong co cha */

     for (i=1; i<=(*T).MaxNode-1; i++){

        printf("Nhap cha cua nut %d: ",i);

        scanf("%d",&(*T).Parent[i]);

        printf("Nhap nhan cua nut %d: ",i);

        fflush(stdin);

        scanf("%d",&(*T).Data[i]);

    }

}

///Hàm main() thực thi chương trình
main(){

    printf("Nhap du lieu cho cay tong quat\n");

    InputTree(&T);

    printf("Danh sach duyet tien tu cua cay vua nhap la\n");

    PreOrder(Root(T),T);

    printf("\nDanh sach duyet trung tu cua cay vua nhap la\n");

    InOrder(Root(T),T);

    printf("\nDanh sach duyet hau tu cua cay vua nhap la\n");

    PostOrder(Root(T),T);

    return 0;

}
« Trước: BÀI TẬP
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!