编程构造二叉树并实现对应的操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Stynis/article/details/80535610

一、编写递归算法,对于二叉树中每一个元素值为x的结点,删去以它为根的子树,并释放相应的空间

        由算法要求可知,需要进行遍历操作,直至查询到元素值为x的结点,然后用调用递归算法删除此结点以下的所有结点和此结点并释放空间。则可以编写代码如下:

int Del_XSub(BiTree &T, char x) {
    if (T->data == x)Del_SubTree(T);
    else {
        if (T->lchild)Del_XSub(T->lchild, x);
        if (T->rchild)Del_XSub(T->rchild, x);
    }
    return OK;
}

void Del_SubTree(BiTree &T) {
    if (T->lchild)Del_SubTree(T->lchild);
    if (T->rchild)Del_SubTree(T->rchild);
    free(T);
    T = NULL;
}

二、编写算法完成下列操作,无重复地输出以孩子兄弟链表存储的数T中所有的边(这里的边是指树T本身的分支,而不是孩子兄弟链表所形成的二叉树的分支)。输出形式为(k1,k2),…,(ki,kj),…,其中,ki和kj为树节点中的结点标识

        根据CSTree的结构特点,每个结点有两个子节点,firstchild为它的第一个孩子结点,nextsibling为它的下一个兄弟结点,通过这样的方法就可以用二叉树来来表示树。那么在遍历的过程中需要注意二叉树的图形和实际表示的树的图形并不一致,需要进行转换。注意到firstchild指向孩子节点,而nextsibling指向的却是和本身同级的兄弟结点,所以在打印输出的时候要注意边的连线问题(同级之间尽管有指针指向,但却不属于边的两端)。编写代码如下:

void OutEdge(CSTree &T) {
    if (T) {
        CSTree p;
        p = T->firstchild;
        while (p) {
            printf("(%c, %c) ", T->data, p->data);
            OutEdge(p);
            p = p->nextsibling;
        }
    }
}

演示结果:


BiTree

结果分析:
        程序采用以.表示结点为空的方法(便于辨认)。根据输入ABC..D.E…得到的二叉树应为下图所示:


bitree1.2
(手画的别介意…)

左为二叉树表示的结构,右为孩子链表结构二叉树表示的数。
则可见输出符合算法要求。

完整代码:
BiTree.h文件

#define OK 1;
#define  ERROR 0;
typedef struct BiTNode {
    char data;
    struct BiTNode  *lchild, *rchild;
}BiTNode, *BiTree;
int CreateBiTree(BiTree &T);
void PrintBiTree(BiTree &T);
void Del_SubTree(BiTree &T);
int Del_XSub(BiTree &T, char x);

typedef struct CSNode {
    char data;
    struct CSNode *firstchild, *nextsibling;
}CSNode, *CSTree;
int CreateCSTree(CSTree &T);
void OutEdge(CSTree &T);

BiTree.cpp文件

#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#include"BiTree.h"
int CreateBiTree(BiTree &T) {
    char ch;
    ch=getchar();
    if (ch == '.'||ch=='\n') { T = NULL; }
    else {
        if(!(T = (BiTNode *)malloc(sizeof(BiTNode))))return ERROR;
        T->data = ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
    return OK;
}

int Del_XSub(BiTree &T, char x) {
    if (T->data == x)Del_SubTree(T);
    else {
        if (T->lchild)Del_XSub(T->lchild, x);
        if (T->rchild)Del_XSub(T->rchild, x);
    }
    return OK;
}

void Del_SubTree(BiTree &T) {
    if (T->lchild)Del_SubTree(T->lchild);
    if (T->rchild)Del_SubTree(T->rchild);
    free(T);
    T = NULL;
}


void PrintBiTree(BiTree &T) {
    if (T) {
        printf("%c",T->data);
        PrintBiTree(T->lchild);
        PrintBiTree(T->rchild);
    }
}


//-------------------------------------------------  CSTree Part   -------------------------------------------------

int CreateCSTree(CSTree &T) {
    char ch;
    ch=getchar();
    if (ch == '.' || ch == '\n')T = NULL;
    else {
        T = (CSNode *)malloc(sizeof(CSNode));
        T->data = ch;
        CreateCSTree(T->firstchild);
        CreateCSTree(T->nextsibling);
    }
    return OK;
}




void OutEdge(CSTree &T) {
    if (T) {
        CSTree p;
        p = T->firstchild;
        while (p) {
            printf("(%c, %c) ", T->data, p->data);
            OutEdge(p);
            p = p->nextsibling;
        }
    }
}

Main.cpp文件

#include<stdio.h>
#include<stdlib.h>
#include"BiTree.h"
int main() {
    BiTree T; 
    char x;
    printf("请输入BiTree元素\n");
    CreateBiTree(T); 
    getchar();
    printf("请输入要删除的元素值\n");
    scanf("%c",&x);
    Del_XSub(T, x); printf("删除后的数为:\n"); PrintBiTree(T);
    printf("\n");
    getchar();

    CSTree R;
    printf("请输入CSTree元素\n");
    CreateCSTree(R);
    getchar();
    OutEdge(R);

    system("pause");
}

猜你喜欢

转载自blog.csdn.net/Stynis/article/details/80535610