第十周项目3 利用二叉树遍历思想解决问题(5)
2015-11-19 18:48
274 查看
问题与代码
/*
*Copyright (c) 2015,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:head.h,main.cpp,zdy.cpp
*作者:陈梦萍
*完成日期:2015年11月19日
*版本号:v1.0
*
*问题描述: 判断二叉树是否相似(关于二叉树t1和t2相似的判断:
①t1,t2都是空的二叉树,相似;
②t1和t2之一为空,另一不为空,则不相似;
③t1的左子树和t2的左子树是相似的,且t1的右子树与t2
的右子树是相似的,则t1和t2相似。)
*输入描述:无
*程序输出:若干数据
*/
//head.h
//main.cpp
//zdy.cpp
运行结果
知识点总结
先判断二叉树是否为空,若左子树和右子树分别相似即为二叉树的相似,否则输入的二叉树不相似。
/*
*Copyright (c) 2015,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:head.h,main.cpp,zdy.cpp
*作者:陈梦萍
*完成日期:2015年11月19日
*版本号:v1.0
*
*问题描述: 判断二叉树是否相似(关于二叉树t1和t2相似的判断:
①t1,t2都是空的二叉树,相似;
②t1和t2之一为空,另一不为空,则不相似;
③t1的左子树和t2的左子树是相似的,且t1的右子树与t2
的右子树是相似的,则t1和t2相似。)
*输入描述:无
*程序输出:若干数据
*/
//head.h
#include <stdio.h> #include <malloc.h> #define MaxSize 100 typedef char ElemType; typedef struct node { ElemType data; //数据元素 struct node *lchild; //指向左孩子 struct node *rchild; //指向右孩子 } BTNode; void CreateBTNode(BTNode *&b,char *str); //由str串创建二叉链 void DestroyBTNode(BTNode *&b); //销毁二叉树 int Like(BTNode *b1,BTNode *b2);
//main.cpp
#include"head.h" int main() { BTNode *b1, *b2, *b3; CreateBTNode(b1,"B(D,E(H(J,K(L,M(,N)))))"); CreateBTNode(b2,"A(B(D(,G)),C(E,F))"); CreateBTNode(b3,"u(v(w(,x)),y(z,p))"); if(Like(b1, b2)) printf("b1和b2相似\n"); else printf("b1和b2不相似\n"); if(Like(b2, b3)) printf("b2和b3相似\n"); else printf("b2和b3不相似\n"); DestroyBTNode(b1); DestroyBTNode(b2); DestroyBTNode(b3); return 0; }
//zdy.cpp
#include "head.h" int Like(BTNode *b1,BTNode *b2) { int like1,like2; if (b1==NULL && b2==NULL) return 1; else if (b1==NULL || b2==NULL) return 0; else { like1=Like(b1->lchild,b2->lchild); like2=Like(b1->rchild,b2->rchild); return (like1 & like2); } } void CreateBTNode(BTNode *&b,char *str) //由str串创建二叉链 { BTNode *St[MaxSize],*p=NULL; int top=-1,k,j=0; char ch; b=NULL; //建立的二叉树初始时为空 ch=str[j]; while (ch!='\0') //str未扫描完时循环 { switch(ch) { case '(': top++; St[top]=p; k=1; break; //为左节点 case ')': top--; break; case ',': k=2; break; //为右节点 default: p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p->rchild=NULL; if (b==NULL) //p指向二叉树的根节点 b=p; else //已建立二叉树根节点 { switch(k) { case 1: St[top]->lchild=p; break; case 2: St[top]->rchild=p; break; } } } j++; ch=str[j]; } } void DestroyBTNode(BTNode *&b) //销毁二叉树 { if (b!=NULL) { DestroyBTNode(b->lchild); DestroyBTNode(b->rchild); free(b); } }
运行结果
知识点总结
先判断二叉树是否为空,若左子树和右子树分别相似即为二叉树的相似,否则输入的二叉树不相似。
相关文章推荐
- java学习笔记03
- 已知先序和中序求后序或中序和后序求先序
- iOS 删除navigationController栈中得某一个viewController
- 填数
- com.android.dex.DexException: Multiple dex files define的解决办法 (Android Studio)
- centos7 增加tomcat开机 启动
- Poj-1410-Intersection
- [BZOJ3747] [POI2015]Kinoman
- 简单项目开发之一(springmvc+log4j)
- 自主实现滑动指示条
- PO BO VO DTO POJO DAO概念及其作用
- PHP-Redis扩展使用手册(四)
- 软件工程课程设计个人博客与团队博客
- 第12周项目3-图遍历算法实现
- spring里面怎么取容器里面的常量值
- js数组操作
- NDK 编译protoc buf lite心得
- 高山仰止,景行景止
- plsql配置远程连接数据库
- 处理百万级以上的数据提高查询速度的方法