Archive | Chương 13 – Cây nhị phân RSS for this section

[C] 896 Kiểm tra cây nhị phân T có phải là “cây nhị phân cân bằng hoàn toàn” hay không?

Tác giả:

  • Trần Hán Huy – tranhanhuy.wordpress.com

Sách:

  • Bài tập kĩ thuật lập trình C/C++ – Nguyễn Tấn Trần Minh Khang

Đề bài

  • 896 Kiểm tra cây nhị phân T có phải là “cây nhị phân cân bằng hoàn toàn” hay không?

Code

//896 Kiểm tra cây nhị phân T có phải là "cây nhị phân cân bằng hoàn toàn" hay không?
//cây nhị phân cân bằng hoàn toàn là cây nhị phân tìm kiếm mà tại mỗi nút của nó 
//số nút của cây con trái và cây con phải chêch lệch ko quá 1
//0 là cây nhị phân tìm kiếm
//1 ko phải là cây nhị phân tìm kiếm
void TimMax(Tree c, int &Max)
{
    if (c==NULL)
        return ;
    if (c->pLeft != NULL)
        Max = (Max > c->pLeft->iX)? Max : c->pLeft->iX;
    if (c->pRight != NULL)
        Max = (Max > c->pRight->iX)? Max : c->pRight->iX;
    Max = (Max > c->iX) ? Max : c->iX;
    TimMax(c->pLeft,Max);
    TimMax(c->pRight,Max);
}
int DemNode(Tree c)
{
    if (c==NULL)
        return 0;
    int DemR = DemNode(c->pRight);
    int DemL = DemNode(c->pLeft);
    return DemR + DemL + 1;
}

int KiemTra(Tree c)
{
    if (c==NULL)
        return 0;
    int Left = KiemTra(c->pLeft);
    //kiểm tra điều kiện của cây nhị phân tìm kiếm
    int MaxL, MaxR;
    if (c->pLeft != NULL && c->pRight != NULL)
    {
        TimMax(c->pLeft, MaxL);
        TimMax(c->pRight, MaxR);
        if (!(MaxL < c->iX && c->iX < MaxR))
            return 1;
    }
    else if (c->pLeft == NULL && c->pRight != NULL)
    {
        TimMax(c->pRight, MaxR);
        if (!(c->iX < MaxR))
            return 1;
    }
    else if (c->pLeft != NULL && c->pRight == NULL)
    {
        TimMax(c->pLeft, MaxL);
        if (!(MaxL < c->iX))
            return 1;
    }
    //kiểm tra điều kiện của cây nhị phân tìm kiếm cân bằng hoàn toàn
    int NodeR = DemNode(c->pRight);
    int NodeL = DemNode(c->pLeft);
    printf ("ntnode: %d lech Right: %d, Left: %d", c->iX,NodeR,NodeL);
    if (abs(NodeR - NodeL) > 1)    //chêch lệch lớn hơn 1
        return 1;
    int Right = KiemTra(c->pRight);
    return Left + Right;
}
void XuatKqKiemTra(Tree c)
{
    int Kt = KiemTra(c);
    if (Kt == 0)
        printf("nla cay nhi phan tim kiem can bang hoan toan");
    else
        printf("nko phai cay nhi phan tim kiem can bang hoan toan");
}

Link source:

[C] 895 Kiểm tra cây nhị phân T có phải là “cây nhị phân cân bằng” hay không?

Tác giả:

  • Trần Hán Huy – tranhanhuy.wordpress.com

Sách:

  • Bài tập kĩ thuật lập trình C/C++ – Nguyễn Tấn Trần Minh Khang

Đề bài

  • 895 Kiểm tra cây nhị phân T có phải là “cây nhị phân cân bằng” hay không?

Code

//895 Kiểm tra cây nhị phân T có phải là "cây nhị phân cân bằng" hay không?
//Cây nhị phân cân bằng là cây nhị phân tìm kiếm mà tại mỗi nút của nó 
//độ cao của cây con trái và cây con phải chêch lệch ko quá 1
//0 là cây nhị phân tìm kiếm
//1 ko phải là cây nhị phân tìm kiếm
void TimMax(Tree c, int &Max)
{
    if (c==NULL)
        return ;
    if (c->pLeft != NULL)
        Max = (Max > c->pLeft->iX)? Max : c->pLeft->iX;
    if (c->pRight != NULL)
        Max = (Max > c->pRight->iX)? Max : c->pRight->iX;
    Max = (Max > c->iX) ? Max : c->iX;
    TimMax(c->pLeft,Max);
    TimMax(c->pRight,Max);
}
int DoCao(Tree c)
{
    if (c==NULL)
        return 0;
    int DoCaoR = DoCao(c->pRight);
    int DoCaoL = DoCao(c->pLeft);
    int max = (DoCaoR > DoCaoL) ? DoCaoR : DoCaoL;
    return max + 1;
}

int KiemTra(Tree c)
{
    if (c==NULL)
        return 0;
    int Left = KiemTra(c->pLeft);
    //kiểm tra điều kiện của cây nhị phân tìm kiếm
    int MaxL, MaxR;
    if (c->pLeft != NULL && c->pRight != NULL)
    {
        TimMax(c->pLeft, MaxL);
        TimMax(c->pRight, MaxR);
        if (!(MaxL < c->iX && c->iX < MaxR))
            return 1;
    }
    else if (c->pLeft == NULL && c->pRight != NULL)
    {
        TimMax(c->pRight, MaxR);
        if (!(c->iX < MaxR))
            return 1;
    }
    else if (c->pLeft != NULL && c->pRight == NULL)
    {
        TimMax(c->pLeft, MaxL);
        if (!(MaxL < c->iX))
            return 1;
    }
    //kiểm tra điều kiện của cây nhị phân tìm kiếm cân bằng
    int DoCaoR = DoCao(c->pRight);
    int DoCaoL = DoCao(c->pLeft);
    printf ("ntnode: %d lech Right: %d, Left: %d", c->iX,DoCaoR, DoCaoL);
    if (abs(DoCaoR - DoCaoL) > 1)    //chêch lệch lớn hơn 1
        return 1;
    int Right = KiemTra(c->pRight);
    return Left + Right;
}
void XuatKqKiemTra(Tree c)
{
    int Kt = KiemTra(c);
    if (Kt == 0)
        printf("nla cay nhi phan tim kiem can bang");
    else
        printf("nko phai cay nhi phan tim kiem can bang");
}

Link source:

[C] 894 Kiểm tra cây nhị phân T có phải là “cây nhị phân tìm kiếm” hay không?

Tác giả:

  • Trần Hán Huy – tranhanhuy.wordpress.com

Sách:

  • Bài tập kĩ thuật lập trình C/C++ – Nguyễn Tấn Trần Minh Khang

Đề bài

  • 894 Kiểm tra cây nhị phân T có phải là “cây nhị phân tìm kiếm” hay không?

Thuật giải 1: tìm max mỗi nhánh (left, right) để so sánh theo đúng qui tắc của cây nhị phân tìm kiếm

Thuật giải 2: Duyệt node theo thứ tự Left Node Right nếu cho ra kết qủa tăng dần thì là cây nhị phân tìmkiếm

Code

/*Nick yahoo: conloyal*/
/*Soft: visual studio 2008*/

//894 Kiểm tra cây nhị phân T có phải là "cây nhị phân tìm kiếm" hay không?
//0 là cây nhị phân
//1 ko phải là cây nhị phân
void TimMax(Tree c, int &Max)
{
    if (c==NULL)
        return ;
    if (c->pLeft != NULL)
        Max = (Max > c->pLeft->iX)? Max : c->pLeft->iX;
    if (c->pRight != NULL)
        Max = (Max > c->pRight->iX)? Max : c->pRight->iX;
    Max = (Max > c->iX) ? Max : c->iX;
    TimMax(c->pLeft,Max);
    TimMax(c->pRight,Max);
}

int KiemTra(Tree c)
{
    if (c==NULL)
        return 0;
    int Left = KiemTra(c->pLeft);
    int MaxL, MaxR;
    if (c->pLeft != NULL && c->pRight != NULL)
    {
        TimMax(c->pLeft, MaxL);
        TimMax(c->pRight, MaxR);
        if (!(MaxL < c->iX && c->iX < MaxR))
            return 1;
    }
    else if (c->pLeft == NULL && c->pRight != NULL)
    {
        TimMax(c->pRight, MaxR);
        if (!(c->iX < MaxR))
            return 1;
    }
    else if (c->pLeft != NULL && c->pRight == NULL)
    {
        TimMax(c->pLeft, MaxL);
        if (!(MaxL < c->iX))
            return 1;
    }
    int Right = KiemTra(c->pRight);
    return Left + Right;
}
void XuatKqKiemTra(Tree c)
{
    int Kt = KiemTra(c);
    if (Kt == 0)
        printf("nla cay nhi phan tim kiem");
    else
        printf("nko phai cay nhi phan tim kiem");
}

Link source:

[C] 893 Tính chiều cao cây

Tác giả:

  • Trần Hán Huy – tranhanhuy.wordpress.com

Sách:

  • Bài tập kĩ thuật lập trình C/C++ – Nguyễn Tấn Trần Minh Khang

Đề bài

  • 893 Tính chiều cao cây

Code

/*Nick yahoo: conloyal*/
/*Soft: visual studio 2008*/

//893 Tính chiều cao cây
int ChieuCao(Tree c)
{
    if (c!=NULL)
    {
        int a = ChieuCao(c->pLeft);
        int b = ChieuCao(c->pRight);
        int max = (a>b)?a:b;
        return 1 + max;
    }
    return 0;
}

Link source:

[C] 892 Tính tổng các nút có đúng 2 con mà thông tin tại nút đó là số chính phương

Tác giả:

  • Trần Hán Huy – tranhanhuy.wordpress.com

Sách:

  • Bài tập kĩ thuật lập trình C/C++ – Nguyễn Tấn Trần Minh Khang

Đề bài

  • 892 Tính tổng các nút có đúng 2 con mà thông tin tại nút đó là số chính phương

Code

/*Nick yahoo: conloyal*/
/*Soft: visual studio 2008*/

//892 Tính tổng các nút có đúng hai con mà thông tin nút đó là số chính phương
bool SoChinhPhuong(int n)
{
    int a = sqrt((double)n);
    if (a*a != n)
        return false;
    return true;
}
int Tinh(Tree c)
{
    if (c!=NULL)
    {
        int a = Tinh(c->pLeft);
        int b = Tinh(c->pRight);
        if (SoChinhPhuong(c->iX))
            if (c->pLeft != NULL && c->pRight != NULL)
                return c->iX + a + b;
        return a + b;
    }
    return 0;
}

Link source: