二叉树基本操作(输出所有叶子节点到根节点的路径)
2015-11-28 16:53
661 查看
/* 功能:(1)输出二叉树的所有叶子节点 (2)输出所有从叶子节点到根节点的路径 (3)输出(2)中最长的一条路径 作者:pussy 日期:2015-11-28 */ # include<stdio.h> # include<malloc.h> typedef struct BiNode{ char data; struct BiNode *lchild,*rchild; }BiNode,*BiTree; void LongestPath(BiTree T,char path[],int &pathLength,char longestPath[],int &longestLength); void createBiTree(BiTree &T); void AllPath(BiTree T,char path[],int &pathLength); void DisDeaf(BiTree T); int main() { BiTree T=NULL; printf("创建二叉树:"); createBiTree(T); char path[100],longestPath[100]; int pathLength=0,longestLength=0; printf("树中有以下的叶子节点:"); DisDeaf(T); printf("\n"); AllPath(T,path,pathLength); LongestPath(T,path,pathLength,longestPath,longestLength); printf("最长的路径是:"); for(int i=longestLength;i>=0;i--) { printf("%c ",longestPath[i]); } printf("\n"); return 0; } //创建二叉树 void createBiTree(BiTree &T) { char ch=getchar(); //输入字符'#'代表空 if(ch=='#') T=NULL; else { T=(BiTree)malloc(sizeof(BiNode)); T->data=ch; T->lchild=T->rchild=NULL; createBiTree(T->lchild); createBiTree(T->rchild); } } //输出所有叶子节点到根的路径 //当T是空节点,返回上一层,不做处理 //当T是叶子节点,先将T加入路径中,在输出路径 //当T不是叶子节点也不是空节点的时候,将该节点加入路径中 //path中存储从根节点到叶子节点的路径,pathLength是path的长度 void AllPath(BiTree T,char path[],int &pathLength) { if(T!=NULL) { if(T->lchild==NULL&&T->rchild==NULL) { path[pathLength]=T->data; printf("%c叶子节点到根节点的路径为: ",T->data); for(int i=pathLength;i>=0;i--) printf("%c ",path[i]); printf("\n"); } else { path[pathLength++]=T->data; AllPath(T->lchild,path,pathLength); AllPath(T->rchild,path,pathLength); pathLength--; } } } //输出最长路径,算法和输出所有路径相似 //不同的是,遇到叶子节点时,比较当前路径和是否比目前记录的最长路径 //还长,如果是,则更新最长路径。 void LongestPath(BiTree T,char path[],int &pathLength,char longestPath[],int &longestLength) { if(T!=NULL) { if(T->lchild==NULL&&T->rchild==NULL) { path[pathLength]=T->data; if(pathLength>longestLength) { for(int i=pathLength;i>=0;i--) { longestPath[i]=path[i]; } longestLength=pathLength; } } else { path[pathLength++]=T->data; LongestPath(T->lchild,path,pathLength,longestPath,longestLength); LongestPath(T->rchild,path,pathLength,longestPath,longestLength); pathLength--; } } } void DisDeaf(BiTree T) { if(T!=NULL) { if(T->lchild==NULL&&T->rchild==NULL) printf("%c ",T->data); DisDeaf(T->lchild); DisDeaf(T->rchild); } }
相关文章推荐
- 百度地图API示例之添加自定义控件
- 1-4-05:整数大小比较
- 卡尔曼滤波原理说明
- c++11 线程池系列之一 所需要的join_threads
- HDFS Short-Circuit Local Reads
- [leetcode]Minimum Depth of Binary Tree
- 51nod 1256 乘法逆元
- JDK切换版本
- 多线程之:java线程创建
- Oracle数据库合并行记录,WMSYS.WM_CONCAT 函數的用法
- 数据结构例程——插入排序之希尔排序
- Hadoop HDFS over HTTP 2.4.1 - Using HTTP Tools
- Win10系统离线安装.NET Framework小技巧
- 关于java中==号的一点了解
- window和mac下go环境的搭建
- Objective-C 协议(接口)
- delphi 获取图片某一像素的颜色值
- 在Xcode7/7.1中使用Http请求
- Java连接MySQl数据库实现代码
- c++11 线程池系列之一 所需要的thread_safe_queue