zoukankan      html  css  js  c++  java
  • (eden)对称二叉树

    Description:

    实在不知道出什么题目了,就还是二叉树吧,你们也别嫌烦。

    判断一棵二叉树是否对称。二叉树节点定义如上次的结构相同:

    typedef struct node {
        int x;
        struct node* left;
        struct node* right;
    } BN;

    不用关心输入,二叉树构造和删除过程已经在main函数中实现,需要你们实现函数

    int isSymmetric(BN* root);

    来判断一棵二叉树是否对称,对称返回1,非对称返回0.

    node结构要按照上面的代码在symmetric.h中进行定义。

    注意被测试二叉树不一定是满二叉树。如果树不存在(根节点指针为空)返回0。如果除根节点外没有任何的其他节点返回1。

    代码

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #define MAXD 50
     4 typedef struct node {
     5     int x;
     6     struct node* left;
     7     struct node* right;
     8 }BN;
     9 void buildTree(BN** root) {
    10     int temp;
    11     BN** que[MAXD];
    12     int head = 0;
    13     int tail = 1;
    14     que[0] = root;
    15     scanf("%d", &temp);
    16     while (temp != -1) {
    17         *que[head] = (BN*)malloc(sizeof(struct node));
    18         (*que[head])->x = temp;
    19         que[tail] = &((*que[head])->left);
    20         tail = (tail + 1) % MAXD;
    21         que[tail] = &((*que[head])->right);
    22         tail = (tail + 1) % MAXD;
    23         head = (head + 1) % MAXD;
    24         scanf("%d", &temp);
    25     }
    26     while (head != tail) {
    27         *que[head] = NULL;
    28         head = (head + 1) % MAXD;
    29     }
    30 }
    31 void freeTree(BN* root) {
    32     if (root != NULL) {
    33         freeTree(root->left);
    34         freeTree(root->right);
    35         free(root);
    36     }
    37 }
    38 int a[100] = {0}, b[100] = {0};
    39 int atot = 0, btot = 0;
    40 void left(BN* k) {
    41     if (k -> left != NULL) {
    42         left(k -> left);
    43     }
    44     a[++atot] = k -> x;
    45     if (k -> right != NULL) {
    46         left(k -> right);
    47     }
    48 }
    49 void right(BN* k) {
    50     if (k -> right != NULL) {
    51         right(k -> right);
    52     }
    53     b[++btot] = k -> x;
    54     if (k -> left != NULL) {
    55         right(k -> left);
    56     }
    57 }
    58 int isSymmetric(BN* k) {
    59     if (k == NULL) {
    60         return 0;
    61     }
    62     if ((k -> left == NULL)&&(k -> right == NULL)) {
    63         return 1;
    64     }
    65     left(k -> left);
    66     right(k -> right);
    67     int i;
    68     for (i = 1; i <= 50; i++) {
    69         if (a[i] != b[i]) {
    70             return 0;
    71         }
    72     }
    73     return 1;
    74 }
    75 int main() {
    76     BN* root = NULL;
    77     buildTree(&root);
    78     printf("%d
    ", isSymmetric(root));
    79     freeTree(root);
    80     return 0;
    81 }
     1 //symmetric.h
     2 
     3 typedef struct node {
     4     int x;
     5     struct node* left;
     6     struct node* right;
     7 }BN;
     8 int a[100] = {0}, b[100] = {0};
     9 int atot = 0, btot = 0;
    10 void left(BN* k) {
    11     if (k -> left != NULL) {
    12         left(k -> left);
    13     }
    14     a[++atot] = k -> x;
    15     if (k -> right != NULL) {
    16         left(k -> right);
    17     }
    18 }
    19 void right(BN* k) {
    20     if (k -> right != NULL) {
    21         right(k -> right);
    22     }
    23     b[++btot] = k -> x;
    24     if (k -> left != NULL) {
    25         right(k -> left);
    26     }
    27 }
    28 int isSymmetric(BN* k) {
    29     if (k == NULL) {
    30         return 0;
    31     }
    32     if ((k -> left == NULL)&&(k -> right == NULL)) {
    33         return 1;
    34     }
    35     left(k -> left);
    36     right(k -> right);
    37     int i;
    38     for (i = 1; i <= 50; i++) {
    39         if (a[i] != b[i]) {
    40             return 0;
    41         }
    42     }
    43     return 1;
    44 }

    标程

    1.#include<stdio.h>
    2.#include<stdlib.h>
    3.#include"symmetric.h"
    4.#define MAXD 50
    5.void buildTree(BN** root) {
    6.    int temp;
    7.    BN** que[MAXD];
    8.    int head = 0;
    9.    int tail = 1;
    10.    que[0] = root;
    11.    scanf("%d", &temp);
    12.    while (temp != -1) {
    13.        *que[head] = malloc(sizeof(struct node));
    14.        (*que[head])->x = temp;
    15.        que[tail] = &((*que[head])->left);
    16.        tail = (tail + 1) % MAXD;
    17.        que[tail] = &((*que[head])->right);
    18.        tail = (tail + 1) % MAXD;
    19.        head = (head + 1) % MAXD;
    20.        scanf("%d", &temp);
    21.    }
    22.    while (head != tail) {
    23.        *que[head] = NULL;
    24.        head = (head + 1) % MAXD;
    25.    }
    26.}
    27.void freeTree(BN* root) {
    28.    if (root != NULL) {
    29.        freeTree(root->left);
    30.        freeTree(root->right);
    31.        free(root);
    32.    }
    33.}
    34.int main() {
    35.    BN* root = NULL;
    36.    buildTree(&root);
    37.    printf("%d
    ", isSymmetric(root));
    38.    freeTree(root);
    39.    return 0;
    40.}
    1.#ifndef SYMM
    2.#define SYMM
    3.#include<stdio.h>
    4.#include<string.h>
    5.#include<stdlib.h>
    6.typedef struct node {
    7.    int x;
    8.    struct node* left;
    9.    struct node* right;
    10.} BN;
    11.int f = 1;
    12.void isSymmetric2(BN* left, BN* right) {
    13.    if (f == 1) {
    14.        if (left == NULL && right != NULL)
    15.            f = 0;
    16.        else if (left != NULL && right == NULL)
    17.            f = 0;
    18.        else if (left != NULL && right != NULL) {
    19.            isSymmetric2(left->left, right->right);
    20.            isSymmetric2(left->right, right->left);
    21.            if (left->x != right->x)
    22.                f = 0;
    23.        }
    24.    }
    25.}
    26.int isSymmetric(BN* root) {
    27.    if (root == NULL) f = 0;
    28.    else isSymmetric2(root->left, root->right);
    29.    return f;
    30.}
    31.#endif

    解释

    标答的更好,因为同时判断了结构上面也是一个对称二叉树,我的有一点投机取巧,就是把根的左节点的左序遍历遍历了一遍,根的右节点的右序遍历遍历了一遍,判断两者相等则是对称,但是这不是充要条件,只是必要条件,侥幸过关==

  • 相关阅读:
    协议(五)-从电报机到智能手机
    协议(四)-通信发展史
    NDK历史版本
    android onKeyDown
    设计模式
    Android获取系统时间的多种方法
    USB 3.0规范中译本 第5章 机械结构
    ES6新特性
    08_SQLyog图形化工具介绍
    07_聚合函数,分组查询&limit关键字
  • 原文地址:https://www.cnblogs.com/iamxiaoyubei/p/5122521.html
Copyright © 2011-2022 走看看