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;
    
    }
    勤能补拙,熟能生巧
  • 相关阅读:
    149. Max Points on a Line(js)
    148. Sort List(js)
    147. Insertion Sort List(js)
    146. LRU Cache(js)
    145. Binary Tree Postorder Traversal(js)
    144. Binary Tree Preorder Traversal(js)
    143. Reorder List(js)
    142. Linked List Cycle II(js)
    141. Linked List Cycle(js)
    140. Word Break II(js)
  • 原文地址:https://www.cnblogs.com/snzhong/p/12444752.html
Copyright © 2011-2022 走看看