*Copyright (c)2017,烟台大学计算机与控制工程学院
*All rights reserved.
*文件名称:
*作    者:邵雪源
*完成日期:2017年11月2日
*版 本 号:v1.0
*问题描述:二叉树遍历的思想解决问题
*     假设二叉树采用二叉链存储结构存储,分别实现以下算法,并在程序中完成测试:
*  (1)计算二叉树节点个数;
*  (2)输出所有叶子节点;
*  (3)求二叉树b的叶子节点个数;
*  (4)设计一个算法Level(b,x,h),返回二叉链b中data值为x的节点的层数。
*  (5)判断二叉树是否相似(关于二叉树t1和t2相似的判断:①t1和t2都是空的二叉树,相似;②t1和t2之一为空,另一不为空,则不相似;③t1的左子树和t2的左子树是相似的,且t1的右子树与t2的右子树是相似的,则t1和t2相似。)
mian.cpp
#include <stdio.h>
#include "btree.h"
int Nodes(BTNode *b)//求出所有节点的个数
{if (b==NULL)return 0;elsereturn Nodes(b->lchild)+Nodes(b->rchild)+1;
}
void DispLeaf(BTNode *b)//输出所有的节点值
{if (b!=NULL){if (b->lchild==NULL && b->rchild==NULL)printf("%c ",b->data);else{DispLeaf(b->lchild);DispLeaf(b->rchild);}}
}
int LeafNodes(BTNode *b)    //求二叉树b的叶子节点个数
{int num1,num2;if (b==NULL)return 0;else if (b->lchild==NULL && b->rchild==NULL)return 1;else{num1=LeafNodes(b->lchild);num2=LeafNodes(b->rchild);return (num1+num2);}
}
int Level(BTNode *b,ElemType x,int h)//设计一个算法Level(b,x,h),返回二叉链b中data值为x的节点的层数
{int l;if (b==NULL)return 0;else if (b->data==x)return h;else{l=Level(b->lchild,x,h+1);if (l==0)return Level(b->rchild,x,h+1);elsereturn l;}
}
/*判断二叉树是否相似(关于二叉树t1和t2相似的判断:
①t1和t2都是空的二叉树,相似;
②t1和t2之一为空,另一不为空,则不相似;
③t1的左子树和t2的左子树是相似的,且t1的右子树与t2的右子树是相似的,则t1和t2相似。)*/
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);}
}int main()
{BTNode *b;CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//建立二叉树0printf("二叉树节点个数: %d\n", Nodes(b));//输出节点的个数printf("二叉树中所有的叶子节点是: ");//打印出所有的叶子节点DispLeaf(b);printf("\n");printf("二叉树b的叶子节点个数: %d\n",LeafNodes(b));//叶子节点的个数printf("值为\'K\'的节点在二叉树中出现在第 %d 层上n",Level(b,'K',1));//返回二叉链b中data值为x的节点的层数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");elseprintf("b1和b2不相似\n");if(Like(b2, b3))printf("b2和b3相似\n");elseprintf("b2和b3不相似\n");DestroyBTNode(b1);DestroyBTNode(b2);DestroyBTNode(b3);DestroyBTNode(b);return 0;
}
*btree.h
#ifndef BTREE_H_INCLUDED
#define BTREE_H_INCLUDED
#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串创建二叉链
BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针
BTNode *LchildNode(BTNode *p);  //返回*p节点的左孩子节点指针
BTNode *RchildNode(BTNode *p);  //返回*p节点的右孩子节点指针
int BTNodeDepth(BTNode *b); //求二叉树b的深度
void DispBTNode(BTNode *b); //以括号表示法输出二叉树
void DestroyBTNode(BTNode *&b);  //销毁二叉树#endif // BTREE_H_INCLUDED
*btree.cpp
#include <stdio.h>
#include <malloc.h>
#include "btree.h"
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];}
}
BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针
{BTNode *p;if (b==NULL)return NULL;else if (b->data==x)return b;else{p=FindNode(b->lchild,x);if (p!=NULL)return p;elsereturn FindNode(b->rchild,x);}
}
BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针
{return p->lchild;
}
BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针
{return p->rchild;
}
int BTNodeDepth(BTNode *b)  //求二叉树b的深度
{int lchilddep,rchilddep;if (b==NULL)return(0);                          //空树的高度为0else{lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddeprchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddepreturn (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);}
}
void DispBTNode(BTNode *b)  //以括号表示法输出二叉树
{if (b!=NULL){printf("%c",b->data);if (b->lchild!=NULL || b->rchild!=NULL){printf("(");DispBTNode(b->lchild);if (b->rchild!=NULL) printf(",");DispBTNode(b->rchild);printf(")");}}
}
void DestroyBTNode(BTNode *&b)   //销毁二叉树
{if (b!=NULL){DestroyBTNode(b->lchild);DestroyBTNode(b->rchild);free(b);}
}

												

第九周项目实践3 利用二叉树遍历思想解决问题相关推荐

  1. 数据结构上机实践第九周项目3 - 利用二叉树遍历思想解决问题

    利用二叉树遍历思想解决问题 学以致用,知行合一,学了知识就要会运用,否则跟背课文没什么区别,上次实践,做了二叉树递归遍历的算法实现,本次实践,将利用遍历思想解决问题,将遍历思想真正的运用到实际问题需求 ...

  2. 第九周项目实践2 二叉树遍历的递归算法

    #ifndef BTREE_H_INCLUDED #define BTREE_H_INCLUDED#define MaxSize 100 typedef char ElemType; typedef ...

  3. 第九周项目实践1 二叉树的链式存储及基本运算 算法库

    btree.h #ifndef BTREE_H_INCLUDED #define BTREE_H_INCLUDED#define MaxSize 100 typedef char ElemType; ...

  4. 利用二叉树的思想来实现分配和释放内存方法

    虽然大部分系统都有提供内存动态分配和释放函数(即C语言中的malloc和free函数),但是在嵌入式开发中由于系统的限制往往需要自己来实现内存管理,如在有些平台上可动态申请的最大空间不能满足程序设计的 ...

  5. 数据结构上机实践第九周项目2 - 二叉树遍历的递归算法

    二叉树遍历的递归算法 递归问题总会成为我们的难点,代码量少,思维量确是很大,难是在所难免的,所以,在思维理解的同时结合实现代码理解,这样就很有可能让我们打开思路,理解的更深,本次实践将在二叉树算法的基 ...

  6. 数据结构上机实践第九周项目1 - 二叉树算法库

    二叉树算法库 学了新的内容就应该有新的应用,本次实践将进行二叉树算法库的建立,来适应更多工程的需求,丰富算法库. 注:在main函数中,创建的用于测试的二叉树如下 首先本次建立算法库实践将会运用到多文 ...

  7. 第九周项目二时间类的重载<<与>>,一目。

    /* * Copyright (c) 2013, 烟台大学计算机学院 * All rights reserved. * 作 者: * 完成日期:2014 年4 月22 日 * 版 本 号:v1.0 * ...

  8. 第10周项目实践 线索二叉树的建立及遍历

    typedef struct node {     Elemtype date;     int ltag,rtag;     struct node lchild;     struct node ...

  9. 第十周项目实践1 二叉树算法验证

    #ifndef BTREE_H_INCLUDED #define BTREE_H_INCLUDED #define MaxSize 100 typedef char ElemType; typedef ...

最新文章

  1. Spring Cloud(四)服务提供者 Eureka + 服务消费者 Feign
  2. 中文NLP的分词真有必要吗?李纪为团队四项任务评测一探究竟 | ACL 2019
  3. 梯度下降回归SGDRegressor、岭回归(Ridge)和套索(Lasso)回归、套索最小角回归、ElasticNet回归、正交匹配追踪回归
  4. 软件测试用python一般用来做什么-想要成为一个优秀的软件测试人员,应该学些什么?...
  5. hdu2602 Bone Collector-01背包问题
  6. [css] 举例说明css的基本语句构成是什么呢?
  7. android 9 pie公司,Android 9.0正式推送 定名Android Pie
  8. 一道组合数学题-马拦过河卒,很精彩
  9. 【php】 布尔值判断
  10. 2018美赛E题翻译
  11. android 刷机文件怎么打开,安卓手机怎么刷机
  12. python_使用需要的气象台站提取气象数据
  13. 蓄力一纪,可以远矣!十二年的百度地图和他的AI新征程
  14. java内存模型 infoq_深入理解 java 内存模型_程晓明_infoq.pdf
  15. 电主轴故障分析及正确处理方法
  16. 背景差法目标识别python_运动目标检测(4)—背景差分法
  17. 身份证识别sdk在生活中的广泛应用
  18. Word利用Aurora插入伪代码
  19. Altium Designer 21 原理图库元件模型的组成介绍以及简单的电阻电容元件模型的创建
  20. 【开发工具】 Office Tool Plus 居然也可以部署 Office 365 我的天 真的是太厉害了

热门文章

  1. HDU2819Swap(二分图最大匹配)
  2. Java程序练习-字符串插入
  3. 如何提高android串口kernel log等级
  4. 关于HP ILO 卡图形界面无响应的解决方案
  5. CMD(SA400 Command)
  6. yum 安装php7和相关扩展
  7. 移动网页设计9大原则——第1部分
  8. 10个步骤:如何成为iPhone游戏开发者
  9. C++ XML解析之TinyXML篇
  10. Silverlight杂记-控件相关