二叉树非递归遍历算法Binary Tree Traverse methods

本文详细介绍了C++中二叉树的创建、节点插入、遍历等基本操作,包括递归和非递归两种实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
Binary Tree Related Operations

@author arhaiyun

*/


#include<iostream>
using namespace std;

typedef int DataType;

typedef struct BiTreeNode
{
	DataType m_nValue;
	struct BiTreeNode m_pLeft;
	struct BiTreeNode m_pRight;
}BiTreeNode, *BiTree;

//[1].Create a new binary tree.
BiTreeNode* CreateBiTree(BiTreeNode* pRoot)
{
	DataType m;
	cin>>m;
	
	if(m == -1)
	{
		return NULL;
	}
	
	// pRoot = new BiTreeNode();
	pRoot = (BiTreeNode*)malloc(sizeof(BiTreeNode));
	pRoot->m_nValue = m;
	pRoot->m_pLeft = pRoot->m_pRight = NULL;
	
	CreateBiTree(pRoot->m_pLeft);
	CreateBiTree(pRoot->m_pRight);
	
	return pRoot;
}


//[2-1].Insert node into a BiSTree Recursively
void InsertNodeToBiSTree_Recursively(BiTreeNode* pRoot, DataType value)
{
	if(pRoot == NULL)
	{
		pRoot = (BiTreeNode*)malloc(sizeof(BiTreeNode));
		pRoot->m_nValue = value;
		pRoot->m_nLeft = pRoot->m_nRight = NULL;
		return ;
	}
	
	if(pRoot->m_nValue == value)
	{
		cout<<"Node has already exists"<<endl;
		return;
	}
	else if(pRoot->m_nValue > value)
	{
		InsertNodeToBiSTree(pRoot->m_pLeft, value);
	}
	else
	{
		InsertNodeToBiTree(pRoot->m_pRight, value);
	}
	
	return;
}

//[2-2].Insert node into a BiSTree Non-Recursively
void InsertNodeIntoBiSTree(BiTreeNode* pRoot, DataType value)
{
	BiTreeNode* pNode = new BiTreeNode();
	pNode->m_nValue = value;
	pNode->m_pLeft = pNode->m_pRight = NULL;
	
	if(NULL == pRoot)
	{	
		pRoot = pNode;
	}
	else
	{
		BiTreeNode* pPrev = new BiTreeNode();
		BiTreeNode* pCurrent = new BiTreeNode();
		
		pCurrent = pRoot;
		while(pCurrent != NULL)
		{
			pPrev = pCurrent;
			
			if(pCurrent->m_nValue > value)
			{
				pCurrent = pCurrent->m_pLeft;
			}
			else if(pCurrent->m_nValue < value)
			{
				pCurrent = pCurrent->m_pRight;
			}
			else
			{
				cout<<"Error:Insert failed current node exists"<<endl;
				return;
			}
		}
		
		if(pPrev->m_nValue > value)
			pPrev->m_pLeft = pNode;
		else
			pPrev->m_pRight = pNode;
		
		delete[] pPrev;
		delete[] pCurrent;
	}
}

/*Traverse Binary Tree in different orders----- Non-Recursively*/
//[3-1].PreorderTraverse
void visit(BiTreeNode* pRoot)
{
	if(!pRoot)
		cout<<pRoot->m_nValue<<" ";
}
void PreorderTraverse(BiTreeNode* pRoot)
{
	BiTreeNode* pCurrent = pRoot;
	stack<BiTreeNode*> nodes;
	
	while(pCurrent != NULL || !nodes.empty())
	{
		while(pCurrent != NULL)
		{
			visit(pCurrent);
			nodes.push(pCurrent);
			pCurrent = pCurrent->m_pLeft;
		}
		if(!nodes.empty())
		{
			pCurrent = nodes.top();
			nodes.pop();
			pCurrent = pCurrent->m_pRight;
		}
	}
}

//[3-2]InorderTraverse
void InorderTraverse(BiTreeNode* pRoot)
{
	BiTreeNode* pCurrent = pRoot;
	stack<BiTreeNode*> nodes;

	while(pCurrent != NULL || !nodes.empty())
	{
		while(pCurrent != NULL)
		{
			nodes.push(pCurrent);
			pCurrent = pCurrent->m_pLeft;
		}
		if(!nodes.empty())
		{
			pCurrent = nodes.top();
			nodes.pop();
			visit(pCurrent);
			pCurrent = pCurrent->m_pRight;
		}
	}
}

//[3-3]PostorderTraverse
typedef enum{L, R}TagType;
typedef struct
{
	BiTreeNode* pNode;
	TagType tag;
}StackNode;

void PostorderTraverse(BiTreeNode* pRoot)
{
	BiTreeNode* pCurrent = pRoot;
	stack<StackNode> nodes;
	StackNode snode = new StackNode();

	do{
		while(pCurrent != NULL)
		{
			snode.pNode = pCurrent;
			snode.tag = L;
			nodes.push(snode);
			pCurrent = pCurrent->m_pLeft;
		}
		
		while(!nodes.empty() && nodes.top().tag == R)
		{
			visit(nodes.top().pNode);
			nodes.pop();
		}
		
		if(!nodes.empty())
		{
			pCurrent = nodes.top().pNode;
			nodes.top().tag = R;
			pCurrent = pCurren->m_pRight;
		}
	}while(!nodes.empty);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值