乐离草 2022-06-03 21:46 采纳率: 50%
浏览 46
已结题

数据结构求二叉树根结点到指定结点的路径无法打印路径怎么办?

二叉树求解路径建立成功入栈成功但是最后无法打印路径

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

#define TRUE 1
#define FALSE 0
#define STACK_EMPTY 0
#define STACK_NOT_EMPTY 1
#define FOUND 1
#define NOT_FOUND 0

#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define MAXLEN 100

#define NLAYER 5

typedef int Status;
typedef char TElemType;
TElemType Nil = ' ';

typedef struct BiTNode {
TElemType data;
struct BiTNode* lchild;
struct BiTNode* rchild;
int is_visit;
}BiTNode, BiTree;// 二叉链表
/
创建二叉树 /
typedef struct StackNode {
BiTree data;// 数据
struct StackNode
next;// 下一个结点
}StackNode, * Stack;// 链栈
/* 创建二叉树结点 /
BiTree createBiTNode();
/
创建二叉树 */
void createBiTree(BiTree );
/
非递归后序遍历寻找路径 */
void PostOrderTraverse(BiTree T, Stack S);
BiTree createBiTNode()
{
BiTree newNode = (BiTree)malloc(sizeof(BiTNode));
if (newNode == NULL) {
printf("错误");
exit(0);
}
newNode->lchild = NULL;
newNode->rchild = NULL;
return newNode;
}
void createBiTree(BiTree T)
{ printf("输入结点:");
TElemType ch;
ch=getchar();
getchar();
if (ch == Nil) /
空 */
*T = NULL;
else
{
*T = (BiTree)malloc(sizeof(BiTNode));
if (!*T)
exit(OVERFLOW);
(T)->data = ch; / 生成根结点 */
(*T)->is_visit = 0;
createBiTree(&(T)->lchild); / 构造左子树 */
createBiTree(&(T)->rchild); / 构造右子树 */
}
}

// 创建栈结点
Stack createStackNode() {
Stack newNode = (Stack)malloc(sizeof(StackNode));
if (newNode == NULL) {
printf("错误");
exit(0);
}
newNode->next = NULL;
return newNode;
}

// 初始化栈,并返回头结点
Stack initStack() {
Stack stack = createStackNode();
BiTree newNode = (BiTree)malloc(sizeof(BiTNode));;
stack->data = newNode;
return stack;
}

// 栈头结点是否存在
int isStackExist(Stack S) {
if (S == NULL) return FALSE;
return TRUE;
}

// 栈是否为空
int isStackEmpty(Stack S) {
if (isStackExist(S) == FALSE) {
return STACK_EMPTY;
}
if (S->next == NULL) {
return STACK_EMPTY;
}
return STACK_NOT_EMPTY;
}

// 入栈,data是要入栈的结点的数据
BiTree push(Stack S, BiTree data) {
if (isStackExist(S) == TRUE) {
Stack node = createStackNode();
node->data = data;
node->next = S->next;
S->next = node;
}
return data;
}

// 出栈,返回栈顶结点的数据
BiTree pop(Stack S) {
BiTree ret;
if (isStackEmpty(S) == STACK_NOT_EMPTY) {
Stack deleted = S->next;
S->next = deleted->next;
ret = deleted->data;
free(deleted);
}
return ret;
}
// 查看栈顶元素
BiTree peek(Stack S) {
if (isStackEmpty(S) == STACK_NOT_EMPTY)
return S->next->data;
else
return NULL;
}
// 清空栈
void clearStack(Stack S) {
while (isStackEmpty(S) == STACK_NOT_EMPTY) {
pop(S);
}
free(S);
}
void PostOrderTraverse(BiTree T, Stack S){
TElemType c;
printf("请输入要查询的结点:");
scanf("%c", &c);
getchar();
printf("非递归后序遍历 栈的具体操作如下:\n");
push(S, T);
printf("push %c\n", T->data);
BiTree p = T;
p->is_visit=1;
int flag = 0;
while ((!isStackEmpty(S)||p)) {
if(p->data == c){
flag=1;
break;
}
if(p->lchild && !p->lchild->is_visit){
push(S, p->lchild);
printf("push %c\n", p->lchild->data);
p = p->lchild;
p->is_visit = 1;
}
else{
if(p->rchild && !p->rchild->is_visit){
push(S,p->rchild);
printf("push %c\n", p->rchild->data);
p = p->rchild;
p->is_visit=1;
}
else{
p = pop(S);
printf("pop %c\n", p->data);
p = peek(S);
}
}
}
if(!flag){
printf("未找到该结点\n");
}
else{
Stack output = initStack();
while(!isStackEmpty(S)){
p=pop(S);
push(output, p);
}
printf("从根结点到%c结点路径为", c);
int len=-1;
while(!isStackEmpty(output)){
p=pop(output);
printf("%c", p->data);
len++;
}
printf("\n路径长度为%d\n", len);
}
}

int main()
{
int c=0; BiTree tree = NULL;
printf("请输入二叉树\n");
createBiTree(&tree);
Stack stack = initStack();
PostOrderTraverse(tree, stack);
return 0;
}

运行结果及报错内容
我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

3条回答 默认 最新

  • sinJack 2022-06-04 01:26
    关注

    程序有正常结束吗,加点输出日志看看。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 6月4日
  • 创建了问题 6月3日

悬赏问题

  • ¥15 sqlserver执行存储过程报错
  • ¥100 nuxt、uniapp、ruoyi-vue 相关发布问题
  • ¥15 浮窗和全屏应用同时存在,全屏应用输入法无法弹出
  • ¥100 matlab2009 32位一直初始化
  • ¥15 Expected type 'str | PathLike[str]…… bytes' instead
  • ¥15 为什么在iis上部署网站,服务器可以访问,但是本地电脑访问不了
  • ¥15 三极管电路求解,已知电阻电压和三级关放大倍数
  • ¥15 ADS时域 连续相位观察方法
  • ¥15 Opencv配置出错
  • ¥15 关于模型导入UNITY的.FBX: Check external application preferences.警告。