数据结构-----中序遍历二叉树非递归算法(利用堆栈实现)

一、非递归中序遍历算法思想

     (1)首先节点指针(一个"根"的指针)进栈,然后将节点指针指向进栈节点的左子树的根,重复(1),直到指针指向空(最后一个进栈的是最左子树),转(2);

         (2)堆栈非空时,从堆栈中退出一个节点的指针,访问该节点,转(3),堆栈为空时,结束算法;

         (3)然后将指针指向的访问过的节点的右子树的跟,转(1)。

二、代码实现

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

typedef char EType; 

struct BinaryTreeNode
{
	EType data;
	struct BinaryTreeNode *LChild;
	struct BinaryTreeNode *RChild;
};
typedef BinaryTreeNode BinaryTree;

typedef struct SType
{
	BinaryTreeNode *ptr;
}SType;

typedef struct Stack
{
	SType *element;
	int top;
	int MaxSize;
}Stack;

void CreatStack(Stack &S,int MaxStackSize);
bool IsEmpty(Stack &S);
bool IsFull(Stack &S);
bool GetTop(Stack &S,SType &result);
bool Pop(Stack &S,SType &result);
bool Push(Stack &S,SType &x);
void CreatBiTree(BinaryTreeNode **BT);
void InOrderNoRecursive(BinaryTreeNode *BT);//跟前序遍历就是这点不同

int main()
{
    BinaryTreeNode *BT = NULL;
	CreatBiTree(&BT);//按照前序遍历输入方式构造一棵二叉树
	printf("中序遍历二叉树非递归算法输出为:");
	InOrderNoRecursive(BT);
	printf("\n");
	return 0;
}

void CreatStack(Stack &S,int MaxStackSize)
{
	S.MaxSize = MaxStackSize;
	S.element = new SType[S.MaxSize];
	S.top = -1;
}

bool IsEmpty(Stack &S)
{
	if(S.top == -1)
		return true;
	return false;
}

bool IsFull(Stack &S)
{
	if(S.top >= S.MaxSize-1)
		return true;
	return false;
}

bool GetTop(Stack &S,SType &result)
{
	if(IsEmpty(S))
		return false;
	result = S.element[S.top];
	return true;
}

bool Pop(Stack &S,SType &result)
{
	if(IsEmpty(S))
		return false;
	result = S.element[S.top];
	S.top--;
	return true;
}

bool Push(Stack &S,SType &x)
{
    if(IsFull(S))
		return false;
	S.top++;
	S.element[S.top] = x;
	return true;
}

void CreatBiTree(BinaryTreeNode **BT)
{
	EType tem;
	
	scanf("%c",&tem);
	if(' ' == tem)
	{
	    *BT = NULL;
	}
	else
	{
		*BT = new BinaryTreeNode;
		(*BT)->data = tem;
		CreatBiTree(&(*BT)->LChild);
        CreatBiTree(&(*BT)->RChild);
	}
}

void InOrderNoRecursive(BinaryTreeNode *BT)
{
	Stack S;
	SType temp;
	BinaryTreeNode *p = BT;
	int MaxStackSize = 50;
	CreatStack(S,MaxStackSize);

	while(p || !IsEmpty(S))
	{
		if(p)
		{
			temp.ptr = p;
			Push(S,temp);
			p = p->LChild;
		}
		else
		{
			if(!IsEmpty(S))
			{
				Pop(S,temp);
				p = temp.ptr;
				printf("%c\t",p->data);//跟前序遍历不同就是访问节点的时机不同
				p = p->RChild;
			}
		}
	}
}
三、 效果展示

建立这样一颗二叉树


所以按照前序遍历输入应该是:“AB_D_ _CE_ _ _”(其中“_”代表空格)

那么运行结果为:



在C++中,我们可以使用栈数据结构实现二叉树的非递归中序遍历。非递归方法利用了迭代的方式,避免了函数调用带来的堆栈空间开销。以下是基本的步骤: 1. 定义一个辅助函数`pushNode()`用于将当前节点压入栈中,因为我们需要先处理左子树再访问根节点。 2. 定义主函数`inOrderNonRecursive(root)`,它接受根节点作为输入。初始化一个空栈和一个指向当前节点的指针。 3. 当栈不为空或者当前节点不为空时,继续循环: - 如果当前节点不为空,将其压入栈,并设置当前节点为它的左子节点。 - 否则,弹出栈顶元素并访问它(即访问右子节点),然后设置当前节点为其右子节点,直到找到未访问的节点。 4. 访问节点的操作通常打印节点值或添加到结果数组中。 下面是一个简单的C++代码示例: ```cpp #include <iostream> #include <stack> struct Node { int data; Node* left, *right; }; void pushNode(Node** root, stack<Node*>& s) { if (*root == nullptr) return; s.push(*root); pushNode(&((*root)->left), s); } void inOrderNonRecursive(Node* root) { stack<Node*> s; Node* curr = root; while (curr != nullptr || !s.empty()) { while (curr != nullptr) { s.push(curr); curr = curr->left; } curr = s.top(); s.pop(); std::cout << curr->data << " "; // 这里可以替换为其他操作,比如添加到容器或数组 curr = curr->right; } } int main() { // 创建一个二叉树实例... Node* root = createYourBinaryTree(); // 假设createYourBinaryTree()是你自定义的函数 inOrderNonRecursive(root); return 0; } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值