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日 | 分类:数据结构 | 标 ...
随机推荐
- Linux使用netstat查看网络状态
查看本机的网络状态.使用netstat查看网络状态.显示系统端口使用情况.UDP类型的端口.TCP类型的端口.只显示所有监听端口.只显示所有监听tcp端口. 命令使用举例 命令 说明 netstat ...
- 解决ASP.NET Core在Task中使用IServiceProvider的问题
前言 问题的起因是在帮同事解决遇到的一个问题,他的本意是在EF Core中为了解决避免多个线程使用同一个DbContext实例的问题.但是由于对Microsoft.Extensions.Depende ...
- ES6 Promise详解
前言 本文主要是对Promise本身的用法做一个全面解析而非它的原理实现,如果你对Promise的用法还不是很熟悉或者想加深你对Promise的理解,我相信这篇文章一定会帮到你. 首先让我们先了解一下 ...
- SpringBoot项目搭建 + Jwt登录
临时接了一个小项目,有需要搭一个小项目,简单记录一下项目搭建过程以及整合登录功能. 1.首先拿到的是一个码云地址,里面是一个空的文件夹,只有一个 2. 拿到HTTPS码云项目地址链接,在IDEA中cl ...
- java方法---定义,调用
定义,调用 1.方法的定义 方法就是一段用来完成特定功能的代码片段,类似于其它语言的函数. 方法用于定义该类或该类的实例的行为特征和功能实现.方法是类和对象行为特征的抽象. 方法很类似于面向过程中的函 ...
- 第四十九篇:webpack的基本使用(三) --安装和配置html-webpack-plugin插件
好家伙, 1.html-webpack-plugin的作用 讲一下为什么需要这个插件 存在问题:在点开locahost:8080之后出现的是项目的根目录,而不是网页 这时候需要再点开scr文件夹才能看 ...
- ansible 003 常用模块
常用模块 file 模块 管理被控端文件 回显为绿色则,未变更,符合要求 黄色则改变 红色则报错 因为默认值为file,那么文件不存在,报错 改为touch则创建 将state改为directory变 ...
- 数据卷之Docker File
DockerFile 是用来构建Docker镜像的构建文件,是由一些列命令和参数构成的脚本.后面再详细了解 DockerFile ! 1.我们在宿主机 /home 目录下新建一个 docker-tes ...
- 用Python实现广度优先搜索
图是一种善于处理关系型数据的数据结构,使用它可以很轻松地表示数据之间是如何关联的 图的实现形式有很多,最简单的方法之一就是用散列表 背景 图有两种经典的遍历方式:广度优先搜索和深度优先搜索.两者是相似 ...
- InnoDB_锁总结
1. 查询会对资源添加共享锁 加了共享锁的资源不可以被修改:但可以被查询(也是会在资源上再加共享锁) 2. 数据修改会对资源添加排他锁 加了排他锁的资源只能被持有这个排他锁的事务读取和修改,其他事务读 ...