题目:二叉树的遍历

二叉树以lson-rson链接方式存储,以菜单方式设计并完成功能任务:建立并存储树、输出前序遍历结果、输出中序遍历结果、输出后序遍历结果、交换左右子树、统计高度,其中对于中序、后序的遍历运算要求采用非递归方式。

完整代码

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

typedef struct Node{
    char data;
    struct Node* left;
    struct Node* right;
}Node;

//交互式创建二叉树 
Node* QandA_Build(int isRoot){
    Node *p; 
    char ch,ch2;
    if (isRoot)
        printf("请输入根结点: ");
    scanf("%c", &ch);
    ch2 = getchar();
    if(ch == '#') p = NULL;
    else{
        isRoot = 0;
        p = (Node*)malloc(sizeof(Node));
        p->data = ch;
        printf("请输入'%c'的左孩子: ", p->data);
        p->left = QandA_Build(isRoot);
        printf("请输入'%c'的右孩子: ", p->data);
        p->right = QandA_Build(isRoot);
    }
    return p;
}

//先序序列创建二叉树 
Node* PreOrder_Build(){
    Node *p;
    char ch;
    scanf("%c", &ch);
    if (ch == '#') p = NULL;
    else{
        p = (Node*)malloc(sizeof(Node));
        p->data = ch;
        p->left = PreOrder_Build();
        p->right = PreOrder_Build();
    }
    return p;
}

//先序遍历(递归)
void PreOrder(Node* t){
    if(!t)
        return ;
    else{
        printf("%c",t->data);
        PostOrder(t->left);
        PostOrder(t->right);
    }
}

//中序遍历(递归)
void InOrder(Node* t){
  if(!t)
        return ;
    else{
        InOrder(t->left);
        printf("%c",t->data);
        InOrder(t->right);
    }
}

//后序遍历(递归)
void PostOrder(Node* t){
    if(!t)
        return ;
    else{
        PostOrder(t->left);
        PostOrder(t->right);
        printf("%c",t->data);
    }
}

//中序遍历(非递归)
void InOrderByStack(Node* t){
    if (t == NULL)
        return;
    Node* stack[100];
    int top = -1; 
    Node* p = t;
    while ( top!=-1 || p ){
        //走到最左边,把走过的结点入栈 
        while(p){
            top++;
            stack[top] = p;
            p = p->left;
        }
        //栈非空,出栈 
        if ( top!=-1 ){
            p = stack[top];
            top--;
            printf("%c",p->data);
            p = p->right;
        }
    }
} 

//后序遍历(非递归)
void PostOrderByStack(Node* t){
    if (t == NULL)
        return;
    Node* stack[100];
    int top = -1;
    
    Node* pCur = t, *pLastVisit = NULL;
    
    //走到最左边 
    while (pCur){
        top++;
        stack[top] = pCur;
        pCur = pCur->left;
    }
    
    while ( top!=-1 ){
        //栈非空,则出栈 
        pCur = stack[top];
        top--;
        //右边为空 或 右边已被访问,打印 
        if (pCur->right == NULL || pCur->right == pLastVisit){
            printf("%c", pCur->data);
            pLastVisit = pCur;
        }
        else{//右边未被访问 
            top++;
            stack[top] = pCur;
            pCur = pCur->right;
            while (pCur){
                top++;
                stack[top] = pCur;
                pCur = pCur->left;
            }
        }
    }
    printf("\n");
}

//交换左右子树 
void Exchange(Node* t){
    Node *temp;
    if(!t)
        return ;
    else{
        temp = t->left;
        t->left = t->right;
        t->right = temp;
        Exchange(t->left);
        Exchange(t->right);
    }
}

//统计二叉树高度 
int Height(Node* t){
    if(t==NULL)
        return 0;
    else if(t->left==NULL && t->right==NULL)
        return 1;
    else
    {
        int Hl,Hr;
        Hl=Height(t->left);
        Hr=Height(t->right);
        if(Hl>Hr)
            return Hl+1;
        else
            return Hr+1;
    }
}

//创建二叉树菜单 
Node* BuildTree(){
    printf("* 欢迎来到二叉树系统,让我们先创建一棵二叉树吧!( òωó)");
    int select, flag = 0;
    char ch;
    Node* tree; 
    while(!flag){
        printf("\n*   1>交互式创建\n*   2>先序序列创建");
        printf("\n* 请选择创建二叉树的方式:");
        scanf("%d", &select);
        ch = getchar();
        printf("\n");
        switch(select){
            case 1:
                printf("请按提示输入结点(空子树则输入'#')。\n"); 
                tree = QandA_Build(1);
                printf("* 创建成功!\n");
                flag = 1;
                break; 
            case 2:
                printf("* 请输入先序序列(空子树则输入'#'):");
                tree = PreOrder_Build();
                printf("* 创建成功!\n");
                flag = 1;
                break; 
            default:
                printf("* 输入错误!请重新输入!\n");
                break;
        }
    }
    return tree;
}

//二叉树功能菜单 
int main(){
    int select;
    Node *tree = BuildTree();
    while(1){
        printf("\n*******欢迎来到二叉树系统******");
        printf("\n***-----1>输出前序遍历------***");
        printf("\n***-----2>输出中序遍历------***");
        printf("\n***-----3>输出后序遍历------***");
        printf("\n***-----4>交换左右子树------***");
        printf("\n***-----5>统计二叉树高度----***");
        printf("\n***-----6>重新创建二叉树----***");
        printf("\n***-----7>退出系统----------***");
        printf("\n*******************************");
        printf("\n* 请输入数字:");
        scanf("%d",&select);
        printf("\n");
        switch(select){
            case 1:
                printf("* 先序遍历为:");
                PreOrder(tree);
                printf("\n"); 
                break;
            case 2:
                printf("* 中序遍历为:");
                InOrderByStack(tree);
                printf("\n* (递归)中序遍历为:");
                InOrder(tree);
                printf("\n"); 
                break;
            case 3:
                printf("* 后序遍历为:");
                PostOrderByStack(tree);
                printf("\n* (递归)后序遍历为:");
                PostOrder(tree);
                printf("\n"); 
                break;
            case 4:
                Exchange(tree);
                printf("* 交换成功!\n");
                break;
            case 5:
                printf("* 该二叉树的高度为:%d\n", Height(tree));
                break;
            case 6:
                tree = BuildTree();
                break;
            case 7:
                printf("* 再见!欢迎下次使用本系统!");
                return 0;
            default:
                printf("* 输入错误!请重新输入!\n");
                break;
                
        }
    }
}

参考资料

(强烈建议阅读及观看!)
二叉树的建立方法总结
【数据结构】细致讲解-二叉树(P3_二叉树的非递归遍历方式 )


ShadowCK
51 声望9 粉丝

这个人是个萌新,什么都没有留下。