栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

非递归执行效率高

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  1. 重复上面的操作即可得到最终的队列为:dbeafcg
(2) 代码实现
#include 
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;
		}
	}
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1011628.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号