zoukankan      html  css  js  c++  java
  • 基础实验4-2.4 搜索树判断 (25分)--二叉搜索树

     

     解题思路:

    1、边输入数据边构造二叉搜索树,输入的数据存入数组a

    2、先前序遍历,结果存入数组tree中

    3、判断tree数组和a数组是否一致

        1)一致,输出YES,后序遍历二叉树输出

        2)不一致,则按镜像二叉树前序遍历,存入数组tree ,再比较tree数组和a数组是否一致

           一致,输出YES,按镜像二叉树后序遍历输出

           否则,输出NO;

    #include <stdio.h>
    #include <malloc.h>
    #define max 100
    typedef struct TNode {
        int Data;
        struct TNode *Left;
        struct TNode *Right;
    }*BiTree;
    BiTree BuildTree(BiTree T,int X) {//建立二叉搜索树
        if(!T) {
            T=(BiTree)malloc(sizeof(BiTree));
            T->Data=X;
            T->Left=T->Right=NULL;
        } else {
            if(X<T->Data)
                T->Left=BuildTree(T->Left,X);
            else
                T->Right=BuildTree(T->Right,X);
        }
        return T;
    }
    int tree[max];
    int k1=0;
    void PreOrderTraverse(BiTree T) {//前序遍历
        if(T) {
    //        printf("%d ",T->Data);
            tree[k1++]=T->Data;
            PreOrderTraverse(T->Left);
            PreOrderTraverse(T->Right);
    
    
        }
    }
    int k2=0;
    void MirrorPreOrder(BiTree T) {//镜像前序遍历
        if(T) {
    //        printf("%d ",T->Data);
            tree[k2++]=T->Data;
            MirrorPreOrder(T->Right);
            MirrorPreOrder(T->Left);
    
        }
    }
    int flag=0;
    void PostOrder(BiTree T) {//后序遍历
        if(T) {
            PostOrder(T->Left);
            PostOrder(T->Right);
            if(flag)
                printf(" ");
            else flag=1;
            printf("%d",T->Data);
        }
    }
    int tag=0;
    void MirrorPostOrder(BiTree T) {//镜像后序遍历
        if(T) {
            MirrorPostOrder(T->Right);
            MirrorPostOrder(T->Left);
            if(tag)
                printf(" ");
            else tag=1;
            printf("%d",T->Data);
        }
    }
    int IsSame(int a[],int tree[],int n) {//判断输入数据是否与前序遍历顺序一致
        int i;
        for(i=0; i<n; i++) {
            if(a[i]!=tree[i])
                return 0;
        }
        return 1;
    }
    int main() {
        int i,x,n;
        scanf("%d",&n);
        int a[n];
        BiTree T=NULL;
        for(i=0; i<n; i++) {
            scanf("%d",&a[i]);
            T=BuildTree(T,a[i]);
        }
        PreOrderTraverse(T);
        if(IsSame(a,tree,n)) {
            printf("YES
    ");
            PostOrder(T);
        } else {
            MirrorPreOrder(T);
            if(IsSame(a,tree,n)) {
                printf("YES
    ");
                MirrorPostOrder(T);
            } else
                printf("NO");
        }
        return 0;
    
    }
    勤能补拙,熟能生巧
  • 相关阅读:
    javascript作用域
    [翻译]Review——How JavaScript works:The building blocks of Web Workers
    [转]Shared——回调函数是什么
    由上一个血案引发的关于property和attribute关系的思考
    RN canvas画布大小之谜
    [转]Tips——Chrome DevTools
    Algorithm——无重复字符的最长子串
    [翻译]Review——The Inner Workings Of Virtual DOM
    Tips——单页面内的多重跳转路由使用
    [转]Shared——Javascript中的call详解
  • 原文地址:https://www.cnblogs.com/snzhong/p/12444752.html
Copyright © 2011-2022 走看看