#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语言二叉树遍历及路径查找的更多相关文章

  1. [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. ...

  2. GMap.Net开发之地址解析与路径查找

    上一篇介绍了如何在GMap地图上添加多边形,这篇介绍下如何使用在线的地图服务进行“地址解析”和“路径查找”. 先看地址解析,GMap中的地址解析主要用到GeocodingProvider中的如下方法: ...

  3. lintcode:二叉树的所有路径

    二叉树的所有路径 给一棵二叉树,找出从根节点到叶子节点的所有路径. 样例 给出下面这棵二叉树: 1 / \ 2 3 \ 5 所有根到叶子的路径为: [ "1->2->5" ...

  4. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  5. 二叉树遍历(flist)(已知中序和按层遍历,求先序 )

    问题 F: 二叉树遍历(flist) 时间限制: 1 Sec  内存限制: 128 MB提交: 11  解决: 9[提交][状态][讨论版][命题人:quanxing][Edit] [TestData ...

  6. 树和二叉树->遍历

    文字描述 二叉树的先根遍历 若二叉树为空,则空操纵,否则 (1) 访问根结点 (2) 先根遍历左子树 (3) 先根遍历右子树 二叉树的中根遍历 若二叉树为空,则空操纵,否则 (1) 中根遍历左子树 ( ...

  7. DS树+图综合练习--二叉树之最大路径

    题目描述 给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构 二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径, ...

  8. 二叉树 遍历 先序 中序 后序 深度 广度 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. 二叉树遍历,递归,栈,Morris

    一篇质量非常高的关于二叉树遍历的帖子,转帖自http://noalgo.info/832.html 二叉树遍历(递归.非递归.Morris遍历) 2015年01月06日 |  分类:数据结构 |  标 ...

随机推荐

  1. postgresql使用group by进行数据去重-2022新项目

    一.业务场景 数据去重是web开发中经常会遇到的方式之一,数据库操作中有一个关键字distinct主要就是用来做这件事,用来进行去重. 比如进行统计查询的时候,可以这样写 select count(d ...

  2. for循环与range的使用

    for循环与range的使用 for循环 for循环的本质 for循环和while循环功能基本一致,while循环可以做到的事情for循环也都可以做到,但是for循环可以给他增加一个定义循环次数和范围 ...

  3. KingbaseESV8R6等待事件之lwlock buffer_content

    前言 等待事件是排查数据库性能的指标之一.简单理解,cpu在处理业务时由于业务逻辑,和不可避免的数据库其他原因造成的前台进程等待,这里的等待事件包含buffer类,io类,以及网络类等等,当我们遇到等 ...

  4. Cluster table 与性能

    用户数据行存储在文件系统中的堆文件中,而这些行以不确定的顺序存储.如果表最初以插入/复制的顺序加载,那么以后的插入.更新和删除将导致在堆文件中以不可预测的顺序添加行.创建索引创建一个指向堆行的辅助文件 ...

  5. 全网最简单的大文件上传与下载代码实现(React+Go)

    前言 前段时间我需要实现大文件上传的需求,在网上查找了很多资料,并且也发现已经有很多优秀的博客讲了大文件上传下载这个功能. 我的项目是个比较简单的项目,并没有采用特别复杂的实现方式,所以我这篇文章的目 ...

  6. C#/VB.NET 在Word文档中插入分页符

    分页符是分页的一种符号,上一页结束以及下一页开始的位置.通查用于在指定位置强制分页.本文将分为两部分来介绍如何在Word文档中插入分页符.并附上C#/VB.NET以供参考,详情请阅读以下内容. 在特定 ...

  7. 在vm中安装centos7

    步骤: 1.打开VMware Worktation,点击"创建新的虚拟机": 2.一般选择"典型(推荐)",之后下一步. 3.选择"稍后安装操作系统& ...

  8. Kubernetes(k8s)为容器设置启动时要执行的命令和参数

    创建 Pod 时设置命令及参数 创建 Pod 时,可以为其下的容器设置启动时要执行的命令及其参数.如果要设置命令,就填写在配置文件的 command 字段下,如果要设置命令的参数,就填写在配置文件的 ...

  9. JS 模块化- 04 CMD 规范与 Sea JS

    1 CMD 规范介绍 CMD: Common Module Definition, 通用模块定义.与 AMD 规范类似,也是用于浏览器端,异步加载模块,一个文件就是一个模块,当模块使用时才会加载执行. ...

  10. JuiceFS 在 Elasticsearch/ClickHouse 温冷数据存储中的实践

    企业数据越存越多,存储容量与查询性能.以及存储成本之间的矛盾对于技术团队来说是个普遍难题.这个难题在 Elasticsearch 与 ClickHouse 这两个场景中尤为突出,为了应对不同热度数据对 ...