详解用栈实现中序遍历--非递归方法(C++)

详解用栈实现中序遍历–非递归方法(C++)

在考研中考察的几率不大。如果大题考察这个问题难度会很大;小题考察这个问题分值有可能会很高💝

非递归执行效率高

在这个实现过程中需要使用栈的数据结构点击查看栈相关笔记

(1) 原理步骤

  1. 构建一个栈 S ,用来接收树的结点。前提是已经层序建好了一棵树

image-20220712222820807

  1. 每次遍历之前都要从树根开始,用一个新的变量 p 来接收树根的地址(后续会接收其他树结点的地址)。判断p存在或者栈s不为空即可继续。此时栈为空,但是树根存在所以p就存在,所以继续。

image-20220712223334405

  1. 如果P存在,就将p压入栈s中,然后p指向自己的左孩子。

image-20220712223627290

  1. 重复第2步的判断。判断p存在或者栈s不为空即可继续。此时,P既存在、栈S又不为空,继续。因为P存在,所以将P压入栈S中,然后P指向自己的左孩子

image-20220712223849087

  1. 重复第2步的判断。判断p存在或者栈s不为空即可继续。此时,P既存在、栈S又不为空,继续。因为P存在,所以将P压入栈S中,然后P指向自己的左孩子

image-20220712224144228

  1. 重复第2步的判断。判断p存在或者栈s不为空即可继续。此时,P不存在,但是栈S不为空,继续。

    因为这里p不存在,执行的操作是:栈S执行出栈操作(这里可以加上控制台输出操作),并且将出栈元素赋值给p

image-20220712225038597

  1. p指向自己的右孩子。

image-20220712225414134

  1. 重复第2步的判断。判断p存在或者栈s不为空即可继续。此时,P不存在,但是栈S不为空,继续。

    因为这里p不存在,执行的操作是:栈S执行出栈操作(这里可以加上控制台输出操作),并且将出栈元素赋值给p

image-20220712225621492

  1. p指向自己的右孩子。

image-20220712225846403

  1. 重复第2步的判断。判断p存在或者栈s不为空即可继续。此时,P既存在、栈S又不为空,继续。因为P存在,所以将P压入栈S中,然后P指向自己的左孩子

image-20220712230128520

  1. 重复第2步的判断。判断p存在或者栈s不为空即可继续。此时,P不存在,但是栈S不为空,继续。

    因为这里p不存在,执行的操作是:栈S执行出栈操作(这里可以加上控制台输出操作),并且将出栈元素赋值给p

image-20220712230538666

  1. p指向自己的右孩子。

image-20220712230720420

  1. 重复第2步的判断。判断p存在或者栈s不为空即可继续。此时,P不存在,但是栈S不为空,继续。

    因为这里p不存在,执行的操作是:栈S执行出栈操作(这里可以加上控制台输出操作),并且将出栈元素赋值给p

image-20220712230910584

  1. p指向自己的右孩子。

image-20220712231018577

  1. 重复第2步的判断。判断p存在或者栈s不为空即可继续。此时,虽然栈S是空的,但是P存在,所以继续。

    因为P存在,所以将P压入栈S中,然后P指向自己的左孩子。

image-20220712231305596

  1. 重复上面的操作即可得到最终的队列为:dbeafcg

(2) 代码实现

#include <iostream>
using namespace std;

//构建树的结构
typedef char BiElemType;
typedef struct BiTNode
{
	BiElemType data;
	BiTNode* lchild;//树的左孩子结点
	BiTNode* rchild;//树的右孩子结点
}BiTNode,*BiTree;

//栈的相关数据结构
#define MaxSize 50
typedef BiTree ElemType;

typedef struct SqStack {
	ElemType data[MaxSize];
	int top;
};

/*
以下为栈的方法实现
*/
void InitStack(SqStack& S) {
	S.top = -1;
}

bool Push(SqStack& S, ElemType e) {
	if (S.top == MaxSize - 1) {
		return false;
	}
	S.top++;
	S.data[S.top] = e;
	return true;
}

bool Pop(SqStack& S, ElemType& x) {
	if (S.top == -1) {
		return false;
	}
	x = S.data[S.top];
	S.top--;
	return true;
}

bool GetTop(SqStack S, ElemType& x) {
	if (S.top == -1)
	{
		return false;
	}
	x = S.data[S.top];
	return true;
}
bool StackEmpty(SqStack S) {
	if (S.top == -1) {
		return true;
	}
	return false;
}

//中序遍历非递归
void InOrder2(BiTree T) {//传入的参数是树根的地址
	SqStack S;
	InitStack(S);
	BiTree p = T;//用一个遍历的变量p,先等于树根
	while (p || !StackEmpty(S)) {
		if (p) {
			//不断压栈的过程找到了最左边的左孩子
			Push(S, p);
			p = p->lchild;
		}
		else
		{
			Pop(S, p);
			putchar(p->data);
			p = p->rchild;
		}
	}
}

image-20220712231743031

  • 12
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不会挂科i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值