关于二叉树的二叉链表存储结构的两道题目
来源:互联网 发布:JVM1099端口被占用 编辑:程序博客网 时间:2024/06/06 19:11
建立二叉树的二叉链表
描述:
已知二叉树的中序序列和前序序列存放在两个一维数组中,尝试建立二叉树的二叉链表。检查是否建立成功的方法是输出该二叉树的后序序列。
输入:
分别输入二叉树的中序序列和前序序列
输出:
输出二叉树的后序序列
输入样例:
ABCDEGFCBEGDFA
输出样例:
CGEFDBA
#include <stdio.h>#include<stdlib.h>#include<string.h>typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild;} BTNODE,*BTLINK;void CreateLeft(BTLINK H,int head,int back,char*pre,char*mid);void CreateRight(BTLINK H,int head,int back,char*pre,char*mid);void BTPrint (BTLINK H);int main(){ BTLINK A; int i; char pre[400]; char mid[400]; char temp; int head,back; gets(pre); gets(mid); head=0; back=strlen(pre)-1; temp=pre[0]; for(i=0;i<strlen(pre);i++) { if(mid[i]==temp)break; } A=(BTLINK)malloc(sizeof(BTNODE)); A->data = temp; if(i==head) A->lchild = NULL; else CreateLeft(A,head,i-1,pre,mid); if(i==back) A->rchild = NULL; else CreateRight(A,i+1,back,pre,mid); BTPrint(A); return 0;}void CreateLeft(BTLINK H,int head,int back,char*pre,char*mid){ BTLINK p; int i,j; char temp; p=H; for(i=0;i<strlen(pre);i++) { for(j=head;j<=back;j++) { if(pre[i]==mid[j]) { temp = pre[i]; p->lchild = (BTLINK)malloc(sizeof(BTNODE)); p->lchild->data = temp; if(j==head) { p->lchild->lchild = NULL; } else { CreateLeft(p->lchild,head,j-1,pre,mid); } if(j == back) { p->lchild->rchild = NULL; } else { CreateRight(p->lchild,j+1,back,pre,mid); } return ; } } }}void CreateRight(BTLINK H,int head,int back,char*pre,char*mid){ BTLINK p; int i,j; char temp; p=H; for(i=0;i<strlen(pre);i++) { for(j=head;j<=back;j++) { if(pre[i]==mid[j]) { temp = pre[i]; p->rchild = (BTLINK)malloc(sizeof(BTNODE)); p->rchild->data = temp; if(j==head) p->rchild->lchild = NULL; else { CreateLeft(p->rchild,head,j-1,pre,mid); } if(j == back) p->rchild->rchild = NULL; else { CreateRight(p->rchild,j+1,back,pre,mid); } return ; } } }}void BTPrint (BTLINK H){ BTLINK p; p=H; if(p->lchild !=NULL) { BTPrint(p->lchild); } if(p->rchild !=NULL) { BTPrint(p->rchild); } printf("%c\n",p->data);}
------------------------------------------------------------------------------
输出以二叉树表示的算术表达式
描述:
编写一个程序,输出以二叉树表示的算术表达式,若表达式中有括号,则应在输出时加上
输入:
按先序输入一行字符,其中#表示取消建立子树节点
输出:
输出以二叉树表示的算术表达式
输入样例:
*+a(###b#)##c##
输出样例:
(a+b)*c
#include <stdio.h>#include<stdlib.h>#include<string.h>typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild;} BTNODE,*BTLINK;void CreateLeft(BTLINK H);void CreateRight(BTLINK H);void BTPrint (BTLINK H);int main(){ BTLINK A; char temp; temp = getchar(); if(temp == '#') { A=NULL; } else { A=(BTLINK)malloc(sizeof(BTNODE)); A->data = temp; CreateLeft(A); CreateRight(A); } BTPrint(A); printf("\n"); return 0;}void CreateLeft(BTLINK H){ BTLINK p; char temp; p=H; temp = getchar(); if(temp=='#') { p->lchild = NULL; } else { p->lchild = (BTLINK)malloc(sizeof(BTNODE)); p->lchild->data = temp; CreateLeft(p->lchild); CreateRight(p->lchild); }}void CreateRight(BTLINK H){ BTLINK p; char temp; p=H; temp = getchar(); if(temp=='#') { p->rchild = NULL; } else { p->rchild = (BTLINK)malloc(sizeof(BTNODE)); p->rchild->data = temp; CreateLeft(p->rchild); CreateRight(p->rchild); }}void BTPrint (BTLINK H){ BTLINK p; p=H; if(p->lchild !=NULL) { BTPrint(p->lchild); } printf("%c",p->data); if(p->rchild !=NULL) { BTPrint(p->rchild); }}
TIP:
1、对于二叉树问题,无论是采用二叉/三叉链表存储方式,还是采用数组存储,体会调用函数时分Left函数和Right函数的好处。
2、连续递归调用的思想:逐层深入直到某一条件,再逐层退出(退出时要完成每层调用返回位置接下来的语句,才能再返回上一层)。
3、记忆前中后序序列的方法,以及了解一些特殊序列如带括号序列,#表示空的序列。
1 0
- 关于二叉树的二叉链表存储结构的两道题目
- 题目1485: 二叉链表存储的二叉树
- 采用二叉链表作为二叉树的存储结构
- 二叉树的二叉链表存储结构
- 二叉树的链式存储结构-二叉链表
- 二叉树的二叉链表存储结构
- _DataStructure_C_Impl:二叉树的二叉链表存储结构
- 二叉树的链式存储结构----二叉链表
- 关于建立二叉链表存储的二叉树:
- [数据结构][二叉链表]二叉树链式存储结构的二叉链表实现
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 二叉树的存储结构
- 1008 of search
- JAVA实现导出Excel(POI)
- Android动画
- Java 把一个文件夹中的所有文件复制到另一个文件夹中
- Servlet学习笔记(一)---Servlet生命周期
- 关于二叉树的二叉链表存储结构的两道题目
- Servlet学习笔记(二)---连接Mysql
- 【OpenCV】OpenCV1.0图像直方图
- 基于github 开源框架Android-PickerView-master实现省市三级联动
- MYSQL数据库自动定期备份和恢复工具
- Servlet学习笔记(三)---Cookies
- 同源策略与JS跨域请求(图文实例详解)
- 1.《介绍Unity中C#脚本语言》
- Servlet学习笔记(四)---Session