二叉树--遍历
二叉树的遍历: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++中的实现方式。 1. **前序遍历**:前序遍历的顺序是根节点 -> 左子树 -> 右子树。在C++中,递归实现可以如下...
c++ 二叉树的遍历
/* 设栈元素为二叉树的指针类型 */ typedef struct { QElemType *base; int front; /* 头指针,若队列不空,指向队列头元素 */ int rear; /* 尾指针,若队列不空,指向队列尾元素的下一个位置 */ } SqQueue; ...
用C++写的,包括二叉树的构建,二叉树的先序遍历、中序遍历和后序遍历非递归算法。
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
根据给定文件的信息,我们可以详细地探讨一下关于二叉树的遍历算法这一主题,包括实验的目的、数据结构的设计、算法的设计以及输入/输出的设计等内容。 ### 实验目的 本次实验的主要目的是让学生深入理解并掌握...
通过这段代码,我们可以学习到如何在C++环境中定义二叉树结构,构建二叉树,以及实现中序遍历。这对于理解和处理涉及树形数据结构的问题非常有用。此外,代码还展示了如何使用模板类来处理不同类型的节点数据,增加...
C++版的二叉树遍历源码,包括:广度优先、深度优先、先序遍历(递归/非递归)、中序遍历(递归/非递归)、后序遍历(递归/非递归)。
使用C++模板、类的技术实现了二叉树的中序遍历,在BC3.1已经测试成功
对二叉树进行前、中、后、层序遍历。对前、中、后分别用递归和非递归。
本主题将深入探讨二叉树的两种主要遍历方法:深度优先遍历(DFS)和宽度优先遍历(BFS)。 1. 深度优先遍历(DFS): - 前序遍历:访问根节点 -> 左子树 -> 右子树。这种遍历方式常用于复制整个树或打印树的结构。...
中序遍历是二叉树遍历的一种重要方法,它按照左子树-根节点-右子树的顺序访问每个节点。本文将详细讲解如何用C++实现二叉树的中序遍历。 首先,我们需要定义一个二叉树节点的结构体。这个结构体通常包含三个成员:...
二叉树的层次遍历(也称为广度优先遍历)是一种遍历二叉树的方法,它按照从根节点开始从上到下、从左到右的顺序访问每个节点。这种遍历方法可以使用队列(Queue)来实现,因为队列是先进先出(FIFO)的数据结构,...
二叉树遍历是访问二叉树中所有节点的一种基本操作,常用于搜索、排序和数据组织等问题。本话题主要关注的是“前序遍历”,这是一种重要的遍历策略,常用于复制或打印树的结构。 **前序遍历**(Preorder Traversal)...
1. **设计与实现**:使用面向对象的程序设计语言(如C++),开发一个程序,该程序能够处理二叉树的各种遍历操作。 2. **技术文档撰写**:在编程实现的过程中撰写相关的技术文档,包括但不限于需求分析、系统设计、...
数据结构C++二叉链表的先序遍历、中序遍历和后序遍历实现
本资源提供了C++实现的各种遍历方法,涵盖了树和二叉树的基本遍历策略。接下来,我们将详细讨论这些遍历方式及其原理。 1. **树的遍历**: - **前序遍历**:先访问根节点,然后遍历左子树,最后遍历右子树。在没有...
用c++代码实现数据结构中,二叉树的前序遍历,中序遍历,后序遍历的算法 为大家提供学习与参考
用C++写了关于二叉树的基本操作--前序、中序、后序遍历,方便大家学习