二叉树·判断相同二叉搜索树

来源:互联网 发布:二手备案域名 编辑:程序博客网 时间:2024/04/28 15:46

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

方法:

为每个序列建树,并利用每棵树的中序遍历判断相同

代码:

#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct BSTree {    int data;    struct BSTree* left;    struct BSTree* right;}*BST,BSTree;BST Insert_Tree(BST root, int key) {    if (root == NULL) {        root = (BST)malloc(sizeof(BSTree));        root -> data = key;        root -> left = NULL;        root -> right = NULL;        return root;    }    else {        if (root -> data > key) {            root -> left = Insert_Tree(root -> left, key);        }        else if (root -> data < key) {            root -> right = Insert_Tree(root -> right, key);        }        return root;    }}int order1[20];int order2[20];int num = 0;int num1 = 0;void Pre_Tree_Fir(BST root) {    if (root == NULL) {        return;    }    Pre_Tree_Fir(root -> left);    Pre_Tree_Fir(root -> right);    order1[num++] = root -> data;    return ;}void Pre_Tree_Sec(BST root) {    if (root == NULL) {        return;    }    Pre_Tree_Sec(root -> left);    Pre_Tree_Sec(root -> right);    order2[num1++] = root -> data;    return ;}int main() {    int n, l;    int i, j, k;    while(~scanf("%d",&n)){        if (n == 0) {            break;        }        scanf("%d",&l);        BST root = NULL, root1 = NULL;        num = 0;        num1 = 0;        for (i = 0; i < n; i++) {            int a;            scanf("%d", &a);            root = Insert_Tree(root, a);        }        Pre_Tree_Fir(root);        while(l --) {            root1 = NULL;            num1 = 0;            for (i = 0; i < n; i++) {                int a;                scanf("%d",&a);                root1 = Insert_Tree(root1, a);            }            Pre_Tree_Sec(root1);            int flag = 1;            for (i = 0; i <= n; i++) {                if (order1[i] != order2[i]) {                    flag = 0;                    break;                }            }            if (flag) {                printf("Yes\n");            }            else {                printf("No\n");            }        }    }    return 0;}