二叉树三种遍历算法的递归和非递归实现(C++)

struct BinaryTreeNode
{
	int m_nValue;
	BinaryTreeNode* m_pLeft;
	BinaryTreeNode* m_pRight;
};
//递归前序遍历
void PreOrder(BinaryTreeNode* pNode)
{
	if(pNode!=NULL)
	{
		cout<<pNode->m_nValue<<endl;
		PreOrder(pNode->m_pLeft);
		PreOrder(pNode->m_pRight);
	}
}
//非递归前序遍历
/*
根据前序遍历访问的顺序,优先访问根结点,然后再分别访问左孩子和右孩子。
即对于任一结点,其可看做是根结点,因此可以直接访问,访问完之后,
若其左孩子不为空,按相同规则访问它的左子树;当访问其左子树时,再访问它的右子树
*/
void PreOrder_loop(BinaryTreeNode* pNode)
{
	stack<BinaryTreeNode*> stackNode;
	while(!pNode||!stackNode.empty())
	{
		while(!pNode)
		{
			cout<<pNode->m_nValue<<endl;
			stackNode.push(pNode);
			pNode=pNode->m_pLeft;
		}
		if(!stackNode.empty())
		{
			pNode=stackNode.top();
			stackNode.pop();
			pNode=pNode->m_pRight;
		}
	}
}
//递归中序遍历
void InOrder(BinaryTreeNode* pNode)
{
	if(pNode!=NULL)
	{
		InOrder(pNode->m_pLeft);
		cout<<pNode->m_nValue<<endl;
		InOrder(pNode->m_pRight);
	}
}
//非递归中序遍历
/*
根据中序遍历的顺序,对于任一结点,优先访问其左孩子,而左孩子结点又可以看做一根结点,
然后继续访问其左孩子结点,直到遇到左孩子结点为空的结点才进行访问,然后按相同的规则访问其右子树。
*/
void InOrder_loop(BinaryTreeNode* pNode)
{
	stack<BinaryTreeNode*> stackNode;
	while(!pNode||!stackNode.empty())
	{
		while(!pNode)
		{
			stackNode.push(pNode);
			pNode=pNode->m_pLeft;
		}
		if(!stackNode.empty())
		{
			pNode=stackNode.top();
			cout<<pNode->m_nValue<<endl;
			stackNode.pop();
			pNode=pNode->m_pRight;
		}
	}
}
//递归后序遍历
void PostOrder(BinaryTreeNode* pNode)
{
	if(pNode!=NULL)
	{
		PostOrder(pNode->m_pLeft);
		PostOrder(pNode->m_pRight);
		cout<<pNode->m_nValue<<endl;
	}
}
//非递归后序遍历
/*
要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,
则可以直接访问它;或者P 存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。
若非上述两种情况,则将P的右孩子和左孩子依次入栈,这样就保证 了每次取栈顶元素的时候,左孩子在右孩子前面被访问,
左孩子和右孩子都在根结点前面被访问。
*/
void PostOrder_loop(BinaryTreeNode* pNode)
{
	stack<BinaryTreeNode*> stackNode;
	BinaryTreeNode* cur;//当前节点
	BinaryTreeNode* pre=NULL;//前一次访问的结点
	stackNode.push(pNode);
	while(!stackNode.empty())
	{
		cur=stackNode.top();
		if((cur->m_pLeft==NULL&&cur->m_pRight==NULL) ||
		(pre!=NULL&&(pre==cur->m_pLeft ||pre==cur->m_pRight)))
		{
			cout<<cur->m_nValue<<endl;
			stackNode.pop();
			pre=cur;
		}
		else
		{
			if(cur->m_pRight!=NULL)
				stackNode.push(cur->m_pRight);
			if(cur->m_pLeft!=NULL)
				stackNode.push(cur->m_pLeft);
		}
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-07 14:26:48

二叉树三种遍历算法的递归和非递归实现(C++)的相关文章

数据结构 《22》---- 二叉树三种遍历的迭代器算法

二叉树的三种遍历有递归版本,和迭代版本.本文介绍一种新的思路. 参考了 http://coolshell.cn/articles/9886.html 在许多应用中,我们还需要对遍历本身进行抽象.假如有一个求和的函数sum,我们希望它能应用于链表,数组,二叉树等等不同的数据结构.这时,我们可以抽象出迭代器(Iterator)的概念,通过迭代器把算法和数据结构解耦了,使得通用算法能应用于不同类型的数据结构. 以下给出了三种遍历的迭代器算法. class Iterator { public: virt

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

二叉树三种遍历递归及非递归实现(Java)

import java.util.Stack; //二叉树三种遍历递归及非递归实现(Java) public class Traverse { /******************定义二叉树**************************/ private final int MAX_SIZE = 10; //链式存储 public static class BinaryTreeNode { int mValue; BinaryTreeNode mLeft; BinaryTreeNode

二叉树三种遍历非递归算法

http://blog.csdn.net/pipisorry/article/details/37353037 c实现: 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; } SqStack; void PreOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { w

二叉树几种遍历算法的非递归实现

二叉树遍历的非递归实现 相对于递归遍历二叉树,非递归遍历显得复杂了许多,但换来的好处是算法的时间效率有了提高.下面对于我学习非递归遍历二叉树算法的过程进行总结 为了便于理解,这里以下图的二叉树为例,分析二叉树的三种遍历方式的实现过程. 一.非递归实现二叉树的前序遍历 不借助递归,要实现二叉树的前序遍历,我们需要用到前面学过的栈这种数据结构.根据前序遍历的定义,先访问根节点,再访问左子树,最后访问右子树.声明指向节点的指针pCur,我们可以先访问根节点,之后让根节点进栈,并让pCur在左子树上移动

对二叉树三种遍历的理解

二叉树普通的遍历分为三种,分别是前序遍历(先序遍历).中序遍历.后序遍历. 这是从别处拷来的一张图,以此图为例说明: 前序遍历的顺序是:根节点.左节点.右节点. 从第一个根节点A开始为ABE,接下来是B开始,由于B没有左节点,所以遍历为BC:然后是E作为开始遍历为EF,C作为开始遍历为CD,F作为开始遍历为FG,G作为开始遍历为GHK. 将上面的一次关联起来,整个前序遍历即为ABCDEFGHK. 中序遍历的顺序是:左节点.根节点.右节点. 从第一个根节点A作为参照遍历为BAE,B作为参照遍历为B

关于二叉树三种遍历的相互推导

嗯..跟着陈越姥姥上数据结构,期末考试遇到一道从后序遍历和中序遍历推前序遍历的题,然后硬是不会做,今天突然有了思路,遂记下来: 原题是这样的:一颗二叉树的后序遍历序列是FDEBGCA,中序遍历序列是FDBEACG,那么前序遍历序列是? 思路如下: 根据后序遍历的性质,最后访问的元素一定是根节点,可知该二叉树根节点为A: 根据中序遍历的性质,出现在A前面的一定是A的左子树里面的节点,出现在A后面的一定是A右子树里面的节点.那么我们现在可以确定FDBE一定是A的左子树,CG一定是A的右子树: 根据树

二叉树几种遍历算法

<span style="font-size:14px;">/*二叉树的遍历*/ #include <iostream> #include <cstring> #include <stack> using namespace std; typedef struct node { char data; struct node *lchild,*rchild; }BinTree; typedef struct node1 { BinTree

java实现二叉树的三种遍历算法(递归)

一,定义一个节点类: package test; public class Node { private int data; private Node left; private Node right; public Node(int data) { this.data = data; } public int getData() { return data; } public void setData(int data) { this.data = data; } public Node ge