二叉树基本运算

要求实现二叉树的基本运算,如创建二叉树、求树的高度,树的遍历。
二叉树结构定义如下:

typedef char ElemType;
typedef struct node
{
    ElemType data;                //数据元素
    struct node *lchild;        //指向左孩子
    struct node *rchild;        //指向右孩子
} BTNode;

函数接口定义:

void CreateBTNode(BTNode *&b,char *str); //根据括号表示法的str,创建二叉树b。 
int BTNodeDepth(BTNode *b);  //求二叉树b的深度。 
void PreOrder(BTNode *b);   //先序遍历二叉树b 
void InOrder(BTNode *b); //中序遍历二叉树b 
void PostOrder(BTNode *b);  //后序遍历二叉树b  
void TravLevel(BTNode *b);  //层次遍历二叉树b  
void DestroyBTNode(BTNode *&b);  //销毁二叉树b。 (由裁判程序实现,略去)

注意:输出遍历序列时,每个结点字符之后均有空格符。

裁判测试程序样例:

int main()
{    
    BTNode *b,*p,*lp,*rp;
    char str[100];
    scanf("%s",str);  
    CreateBTNode(b,str);  //括号表示法创建二叉树 
    printf("Depth:%d\n",BTNodeDepth(b));
    printf("PreOrder:  ");
    PreOrder(b);          //先序遍历
    printf("\n");
    printf("InOrder:  ");
    InOrder(b);           //中序遍历
    printf("\n");
    printf("PostOrder:  ");
    PostOrder(b);         //后序遍历
    printf("\n");
    printf("TravLevel:  ");
    TravLevel(b);   //层次遍历 
    DestroyBTNode(b);  //释放二叉树b 
    return 0;
}

/* 请在这里填写答案 */
 

输入样例:

A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))

输出样例:

Depth:7
PreOrder:  A B D E H J K L M N C F G I 
InOrder:  D B J H L K M N E A F C G I 
PostOrder:  D J L N M K H E B F I G C A 
TravLevel:  A B C D E F G H I J K L M N 

代码实现:

void CreateBTNode(BTNode *&b,char *str)
{
    BTNode *S[100],*p;
    int top=-1,k,j=0;
    char ch;
    b=NULL;
    ch=str[j];
    while(ch!='\0'){
        switch(ch){
            case '(':top++;S[top]=p;k=1;break;
            case ')':top--;break;
            case ',':k=2;break;
            default:
                p=(BTNode *)malloc(sizeof(BTNode));
                p->data=ch;
                p->lchild=p->rchild=NULL;
                if(b==NULL)
                    b=p;
                else{
                    switch(k)
                    {
                        case 1:S[top]->lchild=p;break;
                        case 2:S[top]->rchild=p;break;
                    }
                }
        }
        j++;
        ch=str[j];
    }
} 
int BTNodeDepth(BTNode *b){
    int llength,rlength;
    if(b==NULL) return 0;
    else{
        llength=BTNodeDepth(b->lchild);
        rlength=BTNodeDepth(b->rchild);
    }
    return llength>rlength?(llength+1):(rlength+1);
}
void PreOrder(BTNode *b)
{
    if(b!=NULL)
    {
        printf("%c ",b->data);
        PreOrder(b->lchild);
        PreOrder(b->rchild);
    }
}
void InOrder(BTNode *b)
{
    if(b!=NULL)
    {
        InOrder(b->lchild);
        printf("%c ",b->data);
        InOrder(b->rchild);
    }
}
void PostOrder(BTNode *b)
{
    if(b!=NULL)
    {
        PostOrder(b->lchild);
        PostOrder(b->rchild);
        printf("%c ",b->data);
    }
}
void TravLevel(BTNode *b){
    BTNode *a[100];
    int i=0,j=0;
    a[0]=b;
    while(b){
        BTNode *p=a[j];
        printf("%c ",p->data);
        if(p->lchild)
            a[++i]=p->lchild;
        if(p->rchild)
            a[++i]=p->rchild;
        if(i==j) break;
        j++;
        b=a[j];
    }
}
下面是用C语言实现二叉树基本运算算法的示例代码: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结构体 typedef struct Node { int data; // 数据域 struct Node *left; // 左子节点指针 struct Node *right; // 右子节点指针 } Node; // 创建节点 Node *createNode(int data) { Node *node = (Node *) malloc(sizeof(Node)); node->data = data; node->left = NULL; node->right = NULL; return node; } // 插入节点 Node *insertNode(Node *root, int data) { // 如果根节点为空,则新建一个节点作为根节点 if (root == NULL) { root = createNode(data); } // 如果数据小于根节点的数据,则插入到左子树 else if (data < root->data) { root->left = insertNode(root->left, data); } // 如果数据大于等于根节点的数据,则插入到右子树 else { root->right = insertNode(root->right, data); } return root; } // 查找节点 Node *findNode(Node *root, int data) { // 如果根节点为空,则返回NULL if (root == NULL) { return NULL; } // 如果数据等于根节点的数据,则返回根节点 else if (data == root->data) { return root; } // 如果数据小于根节点的数据,则在左子树中查找 else if (data < root->data) { return findNode(root->left, data); } // 如果数据大于根节点的数据,则在右子树中查找 else { return findNode(root->right, data); } } // 删除节点 Node *deleteNode(Node *root, int data) { Node *temp; if (root == NULL) { return NULL; } else if (data < root->data) { root->left = deleteNode(root->left, data); } else if (data > root->data) { root->right = deleteNode(root->right, data); } else { if (root->left == NULL) { temp = root->right; free(root); return temp; } else if (root->right == NULL) { temp = root->left; free(root); return temp; } else { temp = root->right; while (temp->left != NULL) { temp = temp->left; } root->data = temp->data; root->right = deleteNode(root->right, temp->data); } } return root; } // 中序遍历 void inorderTraversal(Node *root) { if (root != NULL) { inorderTraversal(root->left); printf("%d ", root->data); inorderTraversal(root->right); } } int main() { Node *root = NULL; // 插入节点 root = insertNode(root, 5); root = insertNode(root, 3); root = insertNode(root, 8); root = insertNode(root, 2); root = insertNode(root, 4); root = insertNode(root, 7); root = insertNode(root, 9); // 中序遍历 printf("Inorder traversal: "); inorderTraversal(root); printf("\n"); // 查找节点 Node *node = findNode(root, 4); if (node != NULL) { printf("Node found: %d\n", node->data); } else { printf("Node not found\n"); } // 删除节点 root = deleteNode(root, 5); // 中序遍历 printf("Inorder traversal: "); inorderTraversal(root); printf("\n"); return 0; } ``` 以上代码实现了二叉树基本操作,包括创建节点、插入节点、查找节点、删除节点和中序遍历等。你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值