C语言二叉树遍历及路径查找
#include<iostream>
#include<stdio.h>
#include<math.h>
#include<malloc.h>
using namespace std;
#define MAXQSIZE 100
int k=0;
char nodes[100];
//二叉树的二叉链表存储表示
typedef struct BiNode{
char data; //结点数据域
struct BiNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
//创建队列
typedef struct{
struct BiNode* base[100];
int front,rear;
}SqQueue;
//按先序次序输入二叉树中结点的值创建二叉链表表示的二叉树T
void CreateBiTree(BiTree &T){ //ABC##DE#G##F###
char ch;
cin >> ch;
if(ch=='#')
T=NULL; //递归结束,建空树
else
{
T=(BiTree)malloc(sizeof(BiNode));
T->data=ch;//生成根结点
nodes[k++]=ch;
CreateBiTree(T->lchild); //递归创建左子树
CreateBiTree(T->rchild); //递归创建右子树
} //else
} //CreateBiTree
//先序遍历
void PreOrderTraverse(BiTree T){
if(T)
{
printf("%c ",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
//中序遍历
void InOrderTraverse(BiTree T){
//中序遍历二叉树T的递归算法
if(T){
InOrderTraverse(T->lchild);
printf("%c ",T->data);
InOrderTraverse(T->rchild);
}
}
//后序遍历
void PostOrderTraverse(BiTree T){
if(T)
{
PostOrderTraverse(T->lchild);
PostOrderTraverse(T->rchild);
printf("%c ",T->data);
}
}
//层次遍历
void LevelOrderTraverse(BiTree T){
BiTree p;
SqQueue Q;
Q.rear=Q.front=0;
if (T)
{
Q.base[Q.rear]=T;
Q.rear=(Q.rear+1)%MAXQSIZE;
while (Q.front !=Q.rear)
{
p=Q.base[Q.front];
printf("%c ",p->data);
Q.front=(Q.front+1)%MAXQSIZE;
if (p->lchild)
{
Q.base[Q.rear]=p->lchild;
Q.rear=(Q.rear+1)%MAXQSIZE;
printf("\n");; //使不同层次的结点分行
}
if (p->rchild)
{
Q.base[Q.rear]=p->rchild;
Q.rear=(Q.rear+1)%MAXQSIZE;
}
}
}
}
//求给定结点的路径
void FindPath(BiTree root,char ch){
typedef struct{
BiTree t;
int tag;//tag=0表示访问左子树,tag=1表示访问右子树
}stack;
stack s[100];
int top=0,flag=0,i,j=0;
for(i=0;i<=k;i++)
if(nodes[i]==ch)
j++;
if(j>1)
{
printf("此结点不唯一!\n");
return;
}
while(root||top)
{
while(root&&root->data!=ch)
{
s[++top].t=root;
s[top].tag=0;
root=root->lchild;//访问左子树
}
if(root&&root->data==ch)
{
printf("从根节点到达结点%c的路径为:",ch);
for(int i=1;i<=top;i++)
printf("%c->",s[i].t->data);//ABC##DE#G##F###
flag=1;
printf("%c\n",ch);
return ;
}
while(top&&s[top].tag==1)
top--;//退栈
if(top)
{
s[top].tag=1;
root=s[top].t->rchild;//访问右子树
}
}
if(flag==0)
printf("不存在此结点!\n\n");
return;
}
int main(){
BiTree tree;
int p=-1;
char node;
printf("1.建立二叉树存储结构\n2.求二叉树的先序遍历\n3.求二叉树的中序遍历\n4.求二叉树的后序遍历\n");
printf("5.求二叉树的层次遍历\n6.求给定结点的路径\n0.退出系统\n\n请选择0-6:\n\n");
while(p)
{ printf("请输入:");
scanf("%d",&p);
printf("\n");
switch(p)//ABC##DE#G##F###
{
case 0:
break;
case 1:
printf("请输入建立二叉树的序列:\n");
CreateBiTree(tree);
break;
case 2:
printf("先序遍历:\n");
PreOrderTraverse(tree);
printf("\n\n");
break;
case 3:
printf("中序遍历:\n");
InOrderTraverse(tree);
printf("\n\n");
break;
case 4:
printf("后序遍历:\n");
PostOrderTraverse(tree);
printf("\n\n");
break;
case 5:
printf("层次遍历:\n");
LevelOrderTraverse(tree);
printf("\n\n");
break;
case 6:
printf("请输入结点名称:\n");
cin >> node;
FindPath(tree,node);
break;
default:
break;
}
}
return 0;
}
C语言二叉树遍历及路径查找的更多相关文章
- [LeetCode] Binary Tree Maximum Path Sum 求二叉树的最大路径和
Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. ...
- GMap.Net开发之地址解析与路径查找
上一篇介绍了如何在GMap地图上添加多边形,这篇介绍下如何使用在线的地图服务进行“地址解析”和“路径查找”. 先看地址解析,GMap中的地址解析主要用到GeocodingProvider中的如下方法: ...
- lintcode:二叉树的所有路径
二叉树的所有路径 给一棵二叉树,找出从根节点到叶子节点的所有路径. 样例 给出下面这棵二叉树: 1 / \ 2 3 \ 5 所有根到叶子的路径为: [ "1->2->5" ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- 二叉树遍历(flist)(已知中序和按层遍历,求先序 )
问题 F: 二叉树遍历(flist) 时间限制: 1 Sec 内存限制: 128 MB提交: 11 解决: 9[提交][状态][讨论版][命题人:quanxing][Edit] [TestData ...
- 树和二叉树->遍历
文字描述 二叉树的先根遍历 若二叉树为空,则空操纵,否则 (1) 访问根结点 (2) 先根遍历左子树 (3) 先根遍历右子树 二叉树的中根遍历 若二叉树为空,则空操纵,否则 (1) 中根遍历左子树 ( ...
- DS树+图综合练习--二叉树之最大路径
题目描述 给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构 二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径, ...
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 二叉树遍历,递归,栈,Morris
一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 | 分类:数据结构 | 标 ...
随机推荐
- JVM 系列(4)一看就懂的对象内存布局
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- BZOJ3572/Luogu3233 [Hnoi2014]世界树 (虚树) (Unfinished)
我太弱了,这叼题先搁着把,来日方长,自有切时... ...或许吧 #include <iostream> #include <cstdio> #include <cstr ...
- 微服务性能分析|Pyroscope 在 Rainbond 上的实践分享
随着微服务体系在生产环境落地,也会伴随着一些问题出现,比如流量过大造成某个微服务应用程序的性能瓶颈.CPU利用率高.或内存泄漏等问题.要找到问题的根本原因,我们通常都会通过日志.进程再结合代码去判断根 ...
- OpenStack-iaas之“先点”云平台安装
1.认识OpenStack 1.云计算的起源 早在2006年3月,亚马逊公司首先提出弹性计算云服务.2006年8月9日,谷歌公司首席执行官埃里克·施密特(Eric Schmidt)在谷歌搜索引擎大会( ...
- vue-pdf结合alloyfinger手势缩放旋转上下翻页pdf文件
1. demo线上链接 vuepdf在线demo 2. demo图: 3. 话不多说,上代码: 安装vue-pdf插件: npm i vue-pdf 安装vue-pdf报错catch的可以看我这篇文章 ...
- Python 工匠:一个关于模块的小故事
前言 模块(Module)是我们用来组织 Python 代码的基本单位.很多功能强大的复杂站点,都由成百上千个独立模块共同组成. 虽然模块有着不可替代的用处,但它有时也会给我们带来麻烦.比如,当你接手 ...
- 升级CentOS 7 内核版本
1.查看当前内核版本 $uname -r 3.10.0-957.el7.x86_64 $uname -a Linux prometheus 3.10.0-957.el7.x86_64 #1 SMP T ...
- JSP中的EL 表达式
JSP中的EL 表达式 什么是 EL 表达式,EL 表达式的作用? EL 表达式的全称是:Expression Language.是表达式语言. EL 表达式的什么作用:EL 表达式主要是代替 jsp ...
- 在Linux下配置RealVNC和TigerVNC
作者:alittlemc | 更新中 | 原创文章,可能有技术理解错误,欢迎指正,请与我联系,谢谢! 命令和快速总结 realvnc创建# :会话id -name 取名字 -depth 色深 -geo ...
- 仙人指路,引而不发,Go lang1.18入门精炼教程,由白丁入鸿儒,Golang中New和Make函数的使用背景和区别EP16
Golang只有二十五个系统保留关键字,二十几个系统内置函数,加起来只有五十个左右需要记住的关键字,纵观编程宇宙,无人能出其右.其中还有一些保留关键字属于"锦上添花",什么叫锦上添 ...