二叉搜索树
题目
题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。 输出: 如果序列相同则输出YES,否则输出NO 样例输入: 2 567432 543267 576342 0 样例输出: YES NO
思路
二叉搜索树的特点
二叉查找树,对任何结点x,其左子树中的关键字最大不超过key[x],其右子树中的关键字最小小于key[x]。不同的二叉查找树可以表示同一组值。
内存分配
这道题目本身不难,但是我递归构建树时,却没将局部函数中指针指向malloc申请的内存空间的指针返回,导致gdb调试了好久,内存分配参考链接:http://blog.csdn.net/zinss26914/article/details/8687859
解题思路
- 构建二叉搜索树
- 构建前序遍历数组和中序遍历数组(前序遍历和中序遍历序列可唯一确定一颗二叉树)
- 比较输入字符串构造的前序&&中序数组是否和原树的相同
AC代码
#include <stdio.h> #include <string.h> #include <stdlib.h> #define LEN 21 struct btree { struct btree *lchild, *rchild; char data; }; struct stack { int top; struct btree* arr[LEN]; }; char order_str[LEN], pre_str[LEN], compare_order[LEN], compare_pre[LEN]; struct btree* create_searchtree(struct btree *t, char temp); void order_traverse(struct btree *t, char *A); void pre_traverse(struct btree *t, char *A); void clean_searchtree(struct btree *t); int main() { int i, j, n, len, clen; char str1[LEN], str2[LEN]; while (scanf("%d", &n) != EOF && n != 0) { // 接收客户端数据输入 scanf("%s", str1); struct btree *t; for (i = 0, len = strlen(str1), t = NULL; i < len; i ++) { t = create_searchtree(t, str1[i]); } // 中序遍历二叉树 order_traverse(t, order_str); // 前序遍历二叉树 pre_traverse(t, pre_str); // 接收比较序列 for (i = 0; i < n; i ++) { scanf("%s", str2); struct btree *r; for (j = 0, clen = strlen(str2), r = NULL; j < clen; j ++) { r = create_searchtree(r, str2[j]); } order_traverse(r, compare_order); if (strcmp(order_str, compare_order) != 0) { printf("NO\n"); }else { pre_traverse(r, compare_pre); if (strcmp(pre_str, compare_pre) != 0) { printf("NO\n"); }else { printf("YES\n"); } } clean_searchtree(r); } clean_searchtree(t); } return 0; } /** * Description:构建二叉查找树 */ struct btree* create_searchtree(struct btree *t, char temp) { if (t == NULL) { // 若当前树为空 t = (struct btree *)malloc(sizeof(struct btree) * 1); if (t == NULL) { printf("内存分配失败!\n"); exit(EXIT_FAILURE); } t->data = temp; t->lchild = NULL; t->rchild = NULL; }else if (t->data > temp) { // 如果比当前结点小,则插入左子树 t->lchild = create_searchtree(t->lchild, temp); }else if (t->data < temp){ // 如果比当前结点大,则插入右子树 t->rchild = create_searchtree(t->rchild, temp); } return t; } void order_traverse(struct btree *t, char *A) { struct stack *s = malloc(sizeof(struct stack)); s->top = 0; struct btree *p = t; memset(A, 0, sizeof(A)); int i = 0; while (s->top || p) { if (p) { s->arr[s->top ++] = p; p = p->lchild; } else { p = s->arr[-- s->top]; A[i ++] = p->data; p = p->rchild; } } } void pre_traverse(struct btree *t, char *A) { struct stack *s = malloc(sizeof(struct stack)); s->top = 0; struct btree *p = t; memset(A, 0, sizeof(A)); int i = 0; while (s->top || p) { if (p) { A[i ++] = p->data; s->arr[s->top ++] = p; p = p->lchild; } else { p = s->arr[-- s->top]; p = p->rchild; } } } void clean_searchtree(struct btree *t) { if (t) { clean_searchtree(t->lchild); clean_searchtree(t->rchild); free(t); } } /************************************************************** Problem: 1009 User: wangzhengyi Language: C Result: Accepted Time:10 ms Memory:908 kb ****************************************************************/