`
weihe6666
  • 浏览: 437185 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

C++ 二叉树-遍历

阅读更多
二叉树--遍历


二叉树的遍历:1,递归遍历,效率低
                             2.非递归遍历
本文实现用堆栈存储二叉树的根节点,进行非递归遍历。

//==========================================//
//程序目的:1.建立二叉树                    //
//          2.递归遍历二叉树                //
//          3.非递归遍历二叉树              //
//          4.非递归遍历用栈保存根地址      //
//          5.用链表实现栈                  //
//Written By HEWEI                          //
//2011 06 01                                //
//==========================================//

#include<iostream>
using namespace std;

#define MAX 20
//------------------------------------------//
//------------树节点的声明------------------//
//------------------------------------------//
struct tree
{
	struct tree *left;
	int Data;
	struct tree *right;
};

typedef struct tree nodetree;
typedef nodetree *b_tree;


//-----------------------------------------//
//--------堆栈节点声明存储树节点-----------//
//-----------------------------------------//
struct List
{
	b_tree Tree_Node;
	struct List *pNext;
};
typedef struct List Node;
typedef Node *Link;
//-----------------------------------------//
//-----------非递归法二叉树节点插入--------//
//-----------------------------------------//
b_tree Insert_Tree(int Data,b_tree root)
{
	b_tree currentnode;  //current节点
	b_tree parentnode;   //current的父节点
	b_tree New;          //新建节点


	//初始化新节点
	New = new nodetree[sizeof(nodetree)];
	New->left = NULL;
	New->Data = Data;
	New->right = NULL;

	//判断root是否为空
	if(root == NULL)
	{
		root = New;
	}
	else
	{
		currentnode = root;
		while(currentnode != NULL)
		{
			//判断插在左节点还是右节点
			if(New->Data <= currentnode->Data) //左节点
			{
				//判断左节点是否为空
				if(currentnode != NULL)
				{
					parentnode = currentnode;   //当前节点的父节点
					currentnode = currentnode->left;
				}
				else
					parentnode = currentnode;  //父节点
			}
			else               //右节点
			{

				//判断左节点是否为空
				if(currentnode != NULL)
				{
					parentnode = currentnode;   //当前节点的父节点
					currentnode = currentnode->right;
				}
				else
					parentnode = currentnode;  //父节点
			}
		}
	
		//找到当前插入的位置后插入数据
		if(Data <= parentnode->Data)
		{
			parentnode->left = New;
		}
		else
			parentnode->right = New;
	}
	return root;
}


//-----------------------------------------//
//------------二叉树的建立-----------------//
//-----------------------------------------//
b_tree Create_Tree(int len,int *pArray)
{
	b_tree root;
	int i;

	root = NULL;
	//数组数据储存到二叉树中
    for(i = 0; i<len; i++)
	{
		root = Insert_Tree( pArray[i],root);
	}
	return root;
}


//-----------------------------------------//
//--------递归前序遍历二叉树---------------//
//-----------------------------------------//
void PerInorder(b_tree Pointer)
{
	if (Pointer == NULL)
		return ;
	else 
	{
		cout << Pointer->Data << " ";
		PerInorder(Pointer->left);
        PerInorder(Pointer->right);
	}
}

//----------------------------------------//
//-------------链表建立堆栈---------------//
//----------------------------------------//
Link Create_List()
{
	//声明根节点
	Link List_Root;
	//初始化根节点
	List_Root = new Node[sizeof(Node)];
	List_Root->pNext = NULL;
	List_Root->Tree_Node = NULL;
    return List_Root;
}

b_tree Pop_List(Link & Head)  //出栈,这里用来引用,引用如何应用
{
	b_tree Pop_Treenode;  //用于储存取出的树节点
	Link Pointer;
	//从前面取出数据
	if(Head == NULL)
	{
		cout << "The List is empty!!"<< endl;
		exit(1);
	}
	else
	{
		Pointer = Head;
		Pop_Treenode = Pointer->Tree_Node;
		Head = Head->pNext;
		free(Pointer);  //删除被取出的节点
	}
	return Pop_Treenode;
}
Link Push_List(Link Head,b_tree New_Node) //入栈
{
	Link Pointer;
	Link New;
	New = new Node[sizeof(Node)];
	New->pNext = NULL;
	New->Tree_Node = New_Node;
	////判断根节点是否为空
	if(Head== NULL)
	{
		Head = New;
	}
	else
	{ 
		Pointer = Head;
		Head=New;
		New->pNext = Pointer;//从前面插入,堆栈,先进后出
	}
	return Head;
}

//----------------------------------------//
//---------非递归前序遍历二叉树-----------//
//----------------------------------------//
void PerSearch(b_tree root)
{
	b_tree Pointer;
    Link NewList;
  
   //初始化
   //NewList = Create_List();
   NewList = NULL;
   Pointer = root;
   
   while(Pointer != NULL || NewList != NULL )
   {
        while(Pointer != NULL)
		{
			cout << Pointer->Data << " ";  //输出当前节点数据
            //将当前节点存储到堆中
            NewList = Push_List(NewList,Pointer);
			Pointer = Pointer->left;
		}
		if(NewList != NULL) //取出堆栈中的存储值进行输出
		{
			Pointer = Pop_List(NewList)->right;
		}
   }
}




//----------------------------------------//
//-----------储存数组元素-----------------//
//----------------------------------------//
void Store_Data(int len,int *pArray)
{
	int i;
	int temp;

	for(i = 0; i <len; i++)
	{
		cout <<"Please Input the Data =>";
		cin >> temp;
		pArray[i] = temp;
	}
}

//----------------------------------------//
//--------------主函数--------------------//
//----------------------------------------//
int main(void)
{
	b_tree root = NULL; //声明根节点  
	int i,index,capacity;  
	int value;  
	int nodelist[MAX];  

	//读取数值到数组中  
	cout <<"Please Input the capacity : ";  
	cin >> capacity;  
	cout << endl;  
	Store_Data(capacity,nodelist);  
	//建立二叉树  
	root = Create_Tree(capacity,nodelist);  
	//遍历二叉树  
	cout <<"递归遍历二叉树:";
	PerInorder(root);  
	cout << endl;
	//非递归遍历二叉树
	cout <<"非递归遍历二叉树 :";
	PerSearch(root);
	cout << endl;
	return 0;
}


在编写Pop_List()函数利用了引用,需要注意一下几点:
1.push堆栈时要从Head处push,而不是从Rear处push,这才是先进后出的理念;若从Rear处push则是队列的理念。
2.pop堆栈时也要从Head处pop,无论堆栈还是队列都要从Head处pop,这样便于操作。
3.pop代码
   pointer = Head;
   Head = Head->pNext;
   free(Pointer);

4.push代码
Head处插入:
pointer = Head;
Head = NewNode;
NewNode->pNext = Pointer;

Rear处插入:
pointer = Head;
while(pointer != NULL)
{
  pointer = pointer->pNext;
}
pointer->pNext = NewNode;


二叉树的非递归遍历:
while循环ree节点,知道节点为空,且栈为空
{
a:当树节点不为空时
1,输出当前节点值;2并把当前树节点压入栈;3,继续往下遍历左节点
b:当遍历到树节点为空且栈top不为空
1,将栈顶元素pop;2,准备遍历pop树节点的右节点
}
分享到:
评论

相关推荐

    二叉树各种遍历算法的C++实现

    在这个主题中,我们将深入探讨二叉树的三种主要遍历方法:前序遍历、中序遍历和后序遍历,以及它们在C++中的实现方式。 1. **前序遍历**:前序遍历的顺序是根节点 -&gt; 左子树 -&gt; 右子树。在C++中,递归实现可以如下...

    c++ 二叉树的遍历

    c++ 二叉树的遍历

    二叉树层序遍历-实现代码-队列

    /* 设栈元素为二叉树的指针类型 */ typedef struct { QElemType *base; int front; /* 头指针,若队列不空,指向队列头元素 */ int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */ } SqQueue; ...

    C++ 二叉树的先序遍历、中序遍历和后序遍历非递归算法

    用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。

    二叉树先序遍历、中序遍历和后序遍历非递归算法 C++源码

    用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法

    数据结构实验报告6-树-二叉树的遍历算法-实验内容及要求.docx

    根据给定文件的信息,我们可以详细地探讨一下关于二叉树的遍历算法这一主题,包括实验的目的、数据结构的设计、算法的设计以及输入/输出的设计等内容。 ### 实验目的 本次实验的主要目的是让学生深入理解并掌握...

    c++二叉树中序遍历

    通过这段代码,我们可以学习到如何在C++环境中定义二叉树结构,构建二叉树,以及实现中序遍历。这对于理解和处理涉及树形数据结构的问题非常有用。此外,代码还展示了如何使用模板类来处理不同类型的节点数据,增加...

    C++二叉树的遍历源码

    C++版的二叉树遍历源码,包括:广度优先、深度优先、先序遍历(递归/非递归)、中序遍历(递归/非递归)、后序遍历(递归/非递归)。

    二叉树的遍历的非递归算法(C++模板实现)

    使用C++模板、类的技术实现了二叉树的中序遍历,在BC3.1已经测试成功

    C++ 二叉树的遍历递归、非递归

    对二叉树进行前、中、后、层序遍历。对前、中、后分别用递归和非递归。

    二叉树深度遍历广度遍历

    本主题将深入探讨二叉树的两种主要遍历方法:深度优先遍历(DFS)和宽度优先遍历(BFS)。 1. 深度优先遍历(DFS): - 前序遍历:访问根节点 -&gt; 左子树 -&gt; 右子树。这种遍历方式常用于复制整个树或打印树的结构。...

    二叉树 中序遍历c++实现

    中序遍历是二叉树遍历的一种重要方法,它按照左子树-根节点-右子树的顺序访问每个节点。本文将详细讲解如何用C++实现二叉树的中序遍历。 首先,我们需要定义一个二叉树节点的结构体。这个结构体通常包含三个成员:...

    【C/C++项目开发资源】二叉树层次遍历-二叉树层次遍历

    二叉树的层次遍历(也称为广度优先遍历)是一种遍历二叉树的方法,它按照从根节点开始从上到下、从左到右的顺序访问每个节点。这种遍历方法可以使用队列(Queue)来实现,因为队列是先进先出(FIFO)的数据结构,...

    二叉树遍历--前序遍历

    二叉树遍历是访问二叉树中所有节点的一种基本操作,常用于搜索、排序和数据组织等问题。本话题主要关注的是“前序遍历”,这是一种重要的遍历策略,常用于复制或打印树的结构。 **前序遍历**(Preorder Traversal)...

    数据结构C++二叉树的先序遍历、中序遍历和后序遍历实现

    数据结构C++二叉链表的先序遍历、中序遍历和后序遍历实现

    树/二叉树 各种遍历源代码(C++)

    本资源提供了C++实现的各种遍历方法,涵盖了树和二叉树的基本遍历策略。接下来,我们将详细讨论这些遍历方式及其原理。 1. **树的遍历**: - **前序遍历**:先访问根节点,然后遍历左子树,最后遍历右子树。在没有...

    数据结构 c++程序 实现二叉树的遍历

    用c++代码实现数据结构中,二叉树的前序遍历,中序遍历,后序遍历的算法 为大家提供学习与参考

    C++ 二叉树的遍历

    用C++写了关于二叉树的基本操作--前序、中序、后序遍历,方便大家学习

Global site tag (gtag.js) - Google Analytics