数据结构树的路径

斯班奇的好朋友阿法法 2019-10-07 07:49:15
请教大佬,层序用的是队列, 先序中序用的栈, 是否都能输出某个节点到根结点的路径和 根结点到这个节点的路径? 大佬能否给个代码?
...全文
100 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 wowpH的回复:
路径和遍历顺序没关系吧。我觉得三种遍历都可以找到路径啊。
存在栈里和队列里的都是祖先元素么?
wowpH 2019-10-08
  • 打赏
  • 举报
回复
引用 7 楼 哟呵咯游的回复:
[quote=引用 6 楼 wowpH的回复:][quote=引用 4 楼 哟呵咯游 的回复:] [quote=引用 3 楼 wowpH的回复:]路径和遍历顺序没关系吧。我觉得三种遍历都可以找到路径啊。
存在栈里和队列里的都是祖先元素么?[/quote]对。[/quote] int find(BiTree root, char ch) { if (stackTop > 0 && stack[stackTop - 1] == ch) { return 1; } if (root == NULL) { return 0; } stack[stackTop++] = root->data; if (find(root->lchild, ch) == 1 || find(root->rchild, ch) == 1) { return 1; } stack[--stackTop] = '\0'; return 0; } 这个主函数算前序么[/quote] 先序。。。。。。。。。
  • 打赏
  • 举报
回复
引用 6 楼 wowpH的回复:
[quote=引用 4 楼 哟呵咯游 的回复:] [quote=引用 3 楼 wowpH的回复:]路径和遍历顺序没关系吧。我觉得三种遍历都可以找到路径啊。
存在栈里和队列里的都是祖先元素么?[/quote]对。[/quote] int find(BiTree root, char ch) { if (stackTop > 0 && stack[stackTop - 1] == ch) { return 1; } if (root == NULL) { return 0; } stack[stackTop++] = root->data; if (find(root->lchild, ch) == 1 || find(root->rchild, ch) == 1) { return 1; } stack[--stackTop] = '\0'; return 0; } 这个主函数算前序么
wowpH 2019-10-08
  • 打赏
  • 举报
回复
引用 4 楼 哟呵咯游 的回复:
[quote=引用 3 楼 wowpH的回复:]路径和遍历顺序没关系吧。我觉得三种遍历都可以找到路径啊。
存在栈里和队列里的都是祖先元素么?[/quote]对。
wowpH 2019-10-08
  • 打赏
  • 举报
回复
/*********************************************************************************
	文件:输出从根结点到指定节点的路径
	输入:完全二叉树的顺序输入结点信息,空节点输入'#',输入ENTER表示结束

	日期:2019年10月8日13:55:17
	作者:wowpH
*********************************************************************************/

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAX_TREE_NODE 100
#define NODE_NULL '#'

typedef struct BiTNode {
	char data;
	struct BiTNode* lchild, * rchild;
}BiTNode, * BiTree;

char stack[MAX_TREE_NODE + 1];
int stackTop = 0;

void createBiTree(BiTree* root, char str[], int index);
BiTree createBiTNode();
int find(BiTree root, char ch);

int main() {
	printf("1、层序输入完全二叉树\n");
	printf("2、空节点用'%c'表示\n", NODE_NULL);
	printf("3、输入Enter结束\n");
	printf("4、输入exit表示退出\n\n");
	
	char str[MAX_TREE_NODE + 1];
	printf("输入完全二叉树:");
	while (scanf("%s", &str) != EOF) {
		BiTree root = NULL;
		str[strlen(str)] = '\0';// 可以不要这一行
		if (strcmp(str, "exit") == 0) {
			break;
		}
		createBiTree(&root, str, 0);

		printf("\n输入要查找的结点:");
		char ch;
		do {
			ch = getchar();
		} while (ch == '\n' || ch == NODE_NULL);
		stackTop = 0;
		if (find(root, ch) == 0) {
			printf("\n未找到结点'%c'\n\n", ch);
		} else {
			printf("\n路径:");
			printf("%c", stack[0]);
			for (int i = 1; i < stackTop; ++i) {
				printf(" %c", stack[i]);
			}
			printf("\n\n");
		}

		printf("输入完全二叉树:");
	}
	return 0;
}

void createBiTree(BiTree* root, char str[], int index) {
	if (index >= strlen(str) || str[index] == NODE_NULL) {
		return;
	}
	*root = createBiTNode();
	(*root)->data = str[index];
	createBiTree(&((*root)->lchild), str, index * 2 + 1);
	createBiTree(&((*root)->rchild), str, index * 2 + 2);
}

BiTree createBiTNode() {
	BiTree bt = (BiTree)malloc(sizeof(BiTNode));
	if (bt == NULL) {
		printf("申请结点失败");
		return NULL;
	}
	bt->lchild = NULL;
	bt->rchild = NULL;
	return bt;
}

int find(BiTree root, char ch) {
	if (stackTop > 0 && stack[stackTop - 1] == ch) {
		return 1;
	}
	if (root == NULL) {
		return 0;
	}
	stack[stackTop++] = root->data;
	
	if (find(root->lchild, ch) == 1 || find(root->rchild, ch) == 1) {
		return 1;
	}
	stack[--stackTop] = '\0';
	return 0;
}

/*
1、层序输入完全二叉树
2、空节点用'#'表示
3、输入Enter结束
4、输入exit表示退出

输入完全二叉树:ABCDEF###G

输入要查找的结点:G

路径:A B E G

输入完全二叉树:ABCDEF###G

输入要查找的结点:F

路径:A C F

输入完全二叉树:exit
请按任意键继续. . .
*/
wowpH 2019-10-07
  • 打赏
  • 举报
回复
路径和遍历顺序没关系吧。我觉得三种遍历都可以找到路径啊。
  • 打赏
  • 举报
回复
引用 1 楼 wowpH的回复:
栈里面就是路径
标准答案一般给非递归的后序,我不知道为啥?
wowpH 2019-10-07
  • 打赏
  • 举报
回复
栈里面就是路径
1.算法是程序的灵魂,优秀的程序在对海量数据处理时,依然保持高速计算,就需要高效的数据结构和算法支撑。2.网上数据结构和算法的课程不少,但存在两个问题:1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了2)说是讲数据结构和算法,但大多是挂羊头卖狗肉,算法讲的很少。 本课程针对上述问题,有针对性的进行了升级 3)授课方式采用图解+算法游戏的方式,让课程生动有趣好理解 4)系统全面的讲解了数据结构和算法, 除常用数据结构和算法外,还包括程序员常用10大算法:二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、马踏棋盘算法。可以解决面试遇到的最短路径、最小生成、最小连通图、动态规划等问题及衍生出的面试题,让你秒杀其他面试小伙伴3.如果你不想永远都是代码工人,就需要花时间来研究下数据结构和算法。教程内容:本教程是使用Java来讲解数据结构和算法,考虑到数据结构和算法较难,授课采用图解加算法游戏的方式。内容包括: 稀疏数组、单向队列、环形队列、单向链表、双向链表、环形链表、约瑟夫问题、栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式、递归与回溯、迷宫问题、八皇后问题、算法的时间复杂度、冒泡排序、选择排序、插入排序、快速排序、归并排序、希尔排序、基数排序(桶排序)、堆排序、排序速度分析、二分查找、插值查找、斐波那契查找、散列、哈希表、二叉、二叉与数组转换、二叉排序(BST)、AVL、线索二叉、赫夫曼、赫夫曼编码、多路查找(BB+和B*)、图、图的DFS算法和BFS、程序员常用10大算法、二分查找算法(非递归)、分治算法、动态规划算法、KMP算法、贪心算法、普里姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法马踏棋盘算法。学习目标:通过学习,学员能掌握主流数据结构和算法的实现机制,开阔编程思路,提高优化程序的能力。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧