【数据结构】二叉树根节点到特定节点路径(C语言版)

二叉树——根节点到特定节点路径查找
  • 一、思路
  • 二、代码实现

一、思路

使用二叉链表创建的二叉树,这里我的思路是用链栈来存放找寻二叉树特定节点中,用来存放节点元素

个人思路:创建链栈,遍历二叉树并把路径中节点元素存放到栈中(如下图所示):

L 为一开始创建的链栈头指针
flag = 1,作为标记符,表示还没在一条路径中,找到要找的特定节点元素

在这里插入图片描述

二、代码实现

思路理解不了,可以结合运行结果图,加上自己画图理解,运行结果在最下方

#include<stdio.h>
#include<stdlib.h>//	二叉树结构体 
typedef struct TreeLink{int Data;struct TreeLink *LChild;	//	左子树指针struct TreeLink *RChild;	//	右子树指针
}T_LINK,*TLINK;	//	链栈 
typedef struct STACK{int data;struct STACK *next;	}StackNode,*Stack; int flag;	//	标记符 
Stack L;	//	链栈头节点指针 //************************* 二叉树 ***********************// 
//	创建二叉树 
TLINK Create_TreeLink()
{TLINK T;int data;int temp;scanf("%d",&data);temp = getchar();	//	吸收scanf带来的回车 if(data == -1){		//	输入-1表示该节点下左树或者右树下不存数据,返回到上一级节点 return NULL;		}else{T = (TLINK)malloc(sizeof(T_LINK));	//	每个节点开辟空间 T->Data = data;printf("请输入%d节点下左节点数据:  ",data);T->LChild = Create_TreeLink();printf("请输入%d节点下右节点数据:  ",data);T->RChild = Create_TreeLink();return T;}}
//	先序遍历二叉树
void ShowXianXu(TLINK S)
{if(S==NULL){return;}	printf("%d ",S->Data);ShowXianXu(S->LChild);ShowXianXu(S->RChild);
} //************************* 链 栈 *********************////	入栈
void PushStack(int x)
{Stack top;top = (Stack)malloc(sizeof(StackNode));top->data = x;top->next = L;		//	第一次是让一开始的头节点存入元素,尾巴指向NULL已经初始化好L = top;			//	之后便是创建新的链栈节点和之前的串起来
} //	出栈
int PopStack()
{int x;if(L->next==NULL)	//	栈空{printf("出栈完毕\n");exit(-1);}else{Stack p;x = L->data;p = L;			//	让原来的L变成P L = p->next;	//	原来头节点next指向的变成新的头节点 free(p);		//	释放原来的头节点 return x;		//	返回原来头节点里头的元素 }} //	进入二叉树搜索特定节点
void CherkNode(TLINK T,int data)
{if(T==NULL){return;}	if(flag==1)		//	标记符flag 还是1时,表示还没找到要找的节点 {printf("入栈元素为: %d\n",T->Data);PushStack(T->Data); 	//	入栈}if(T->Data == data)		//	已经在二叉树中遍历到要找的节点元素 {printf("元素找到,元素为: %d\n",T->Data);flag = 0;return; }CherkNode(T->LChild,data);	//	遍历这个节点左子树,为NULL时才结束递归,返回上一级节点CherkNode(T->RChild,data);	//	遍历这个节点的右子树,为NULL时返回上一级节点if(flag==1)		//	递归遍历二叉树每条路径中寻找,由于遍历一个节点 {				//	就会让元素入栈,以便将后面元素不是要找路径之中的元素,从栈中清除 printf("出栈元素: %d\n",T->Data); PopStack();	//	清除非要寻找路径上的栈中元素	}} 
//	搜索路径 
void SearchPath(TLINK T,int data)
{int temp[30];	//	用来存最后找到的路径各个节点里头的数据 int i;flag = 1;		//	标记符 L = (Stack)malloc(sizeof(StackNode));	//	分配空间给指针 L->next = NULL;		//	让第一个节点指针指向NULL,最后也就是栈底指针 if(T==NULL)		//	空树 {return;}CherkNode(T,data);	//	搜索二叉树中要找的节点,进行入栈出栈操作 for(i=0;L->next;i++){temp[i] = PopStack();	//	找到的路径元素逆序存放在数组temp[]中 } printf("路径寻找成功,路径如下:\n");for(i--;i>=0;i--){printf("%d ",temp[i]);}
}//	主函数 
int main()
{TLINK T;				//	创建二叉树指针  int Node;printf("请输入第一个节点(输入-1表示该节点下无其他节点)\n");T = Create_TreeLink();printf("先序遍历如下:\n"); ShowXianXu(T); putchar('\n');printf("请输入你要找的特定节点:\n");scanf("%d",&Node);SearchPath(T,Node);		//	开始搜索节点return 0;
}

运行结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/468583.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为机考入门python3--(13)牛客13-句子逆序

分类&#xff1a;列表 知识点&#xff1a; 列表逆序&#xff08;和字符串逆序是一样的&#xff09; my_list[::-1] 题目来自【牛客】 def reverse_sentence(sentence): # 将输入的句子分割words sentence.split() # 将单词逆序排列 words words[::-1] # 将单词用空…

python小项目----多重剪切板

代码&#xff1a; import shelve,pyperclip,sysimport mcbmcbShelfshelve.open(mcb)# 保存剪切板内容 if len(sys.argv)3 and sys.argv[1].lower()save:#剪切板的内容保存到第三个参数中mcbShelf[sys.argv[2]]pyperclip.paste()print("你的剪切板中的内容将被保存到mcbSh…

[Doris] Doris的安装和部署 (二)

文章目录 1.安装要求1.1 Linux操作系统要求1.2 软件需求1.3 注意事项1.4 内部端口 2.集群部署2.1 操作系统安装要求2.2 下载安装包2.3 解压2.4 配置FE2.5 配置BE2.6 添加BE2.7 FE 扩容和缩容2.8 Doris 集群群起脚本 3.图形化 1.安装要求 1.1 Linux操作系统要求 1.2 软件需求 1…

【MySQL】学习约束和使用图形化界面创建表

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-iqtbME2KmWpQFQSt {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Python数学建模之回归分析

1.基本概念及应用场景 回归分析是一种预测性的建模技术&#xff0c;数学建模中常用回归分析技术寻找存在相关关系的变量间的数学表达式&#xff0c;并进行统计推断。例如&#xff0c;司机的鲁莽驾驶与交通事故的数量之间的关系就可以用回归分析研究。回归分析根据变量的…

小结与数字的魅力的开篇

小结 本系列主要介绍了一些排序算法&#xff0c;包括冒泡排序、快速排序、直接插入排序、希尔排序、简单选择排序、堆排序、归并排序、计数排序、桶排序和基数排序。 排序算法本身并不难&#xff0c;但其涉及的知识点却星罗棋布&#xff0c;其变化莫测的思路更让人难以捉摸&am…

django CBV 与 DRF APIView源码分析

django CBV源码分析 在django框架中&#xff0c;视图层中的逻辑即可以使用函数处理也可以使用类进行处理&#xff0c;如果在视图层中使用函数处理请求&#xff0c;就是FBV(function base views)&#xff0c;如果在视图层中使用类处理请求&#xff0c;就是CBV(class base views…

【lesson54】线程互斥

文章目录 线程互斥 线程互斥 互斥量mutex 大部分情况&#xff0c;线程使用的数据都是局部变量&#xff0c;变量的地址空间在线程栈空间内&#xff0c;这种情况&#xff0c;变量归属单个线程&#xff0c;其他线程无法获得这种变量。但有时候&#xff0c;很多变量都需要在线程间…

计算机服务器中了locked勒索病毒怎么处理,locked勒索病毒解密数据恢复

网络技术的不断发展&#xff0c;为企业的生产生活提供了极大便利&#xff0c;但也为网络安全带来严重威胁。近期&#xff0c;云天数据恢复中心接到某集团企业的求助&#xff0c;企业的计算机服务器遭到了locked勒索病毒攻击&#xff0c;导致企业系统内部的金蝶账套全部被加密&a…

前端学习的笔记第二篇

vscode如何快速生成代码 ! Tab 效果&#xff1a; 解析&#xff1a; <!DOCTYPE html>: 指定当前html版本5。 <html lang"en">: lang > language&#xff0c;en > english。指定当前页面内容是英文的。 <meta charset"UTF-8">:…

DS:树及二叉树的相关概念

创作不易&#xff0c;兄弟们来波三连吧&#xff01;&#xff01; 一、树的概念及结构 1.1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c…

Qt之条件变量QWaitCondition详解

QWaitCondition内部实现结构图&#xff1a; 相关系列文章 C之Pimpl惯用法 目录 1.简介 2.示例 2.1.全局配置 2.2.生产者Producer 2.3.消费者Consumer 2.4.测试例子 3.原理分析 3.1.辅助函数CreateEvent 3.2.辅助函数WaitForSingleObject 3.3.QWaitConditionEvent …