关于二叉树四种遍历方式以及一些基本操作的方法总结

来源:互联网 发布:erp系统模拟软件 编辑:程序博客网 时间:2024/06/05 18:08

去年学完了《数据结构》这门课程,可是学完之后却没有进行系统的复习。最近有些时间,于是便对数据结构这门课程进行了一下系统的复习。 复习完二叉树这一部分的知识后,有些心得感悟于是绝对将它们写成这篇博客。
先讲二叉树的几种遍历方法。遍历二叉树的方法一共有四种,分别是:先序遍历(前序遍历)、中序遍历、后序遍历和层次遍历。前面三种都是递归的定义,因此可以用递归的算法来进行实现,而层次遍历则无法用递归的方式来实现。
下面是二叉树和其节点的数据结构:

  

          

struct BiTNode
{
  char data;
  BiTNode* lchild;
  BiTNode* rchild;
};
typedef BiTNode* BiTree;

        运用递归方法来实现先序、中序和后序遍历很容易,几行代码便可以了:
先序遍历的递归算法:

void BinTree_DLR(BiTree bt){    if(bt!=NULL)    {       cout<<bt->data<<"  ";       BinTree_DLR(bt->lchild);       BinTree_DLR(bt->rchild);     }}

中序遍历的递归算法:

void BinTree_LDR(BinTree bt){   if(bt!=NULL)   {      BinTree_LDR(bt->lchild);      cout<<bt->data<<"  ";      BinTree_LDR(bt->rchild);   }}

后序遍历的递归算法:

void BinTree_LRD(BinTree bt){   if(bt!=NULL)  {     BinTree_LRD(bt->lchild);     BInTree_LRD(bt->rchild);     cout<<bt->data<<"  ";   }}

上面是三种遍历方式的递归算法,那么它们的非递归算法怎么写呢?其实,递归算法的实现是依靠计算机中的堆栈来实现的,我们可以利用一个辅助栈来模拟实现三种遍历的非递归算法。先序遍历的非递归算法:

void BinTree_PreOrder(BiTree bt){stack<BiTNode*> s;BiTNode* pNode;pNode = bt;if (pNode == NULL)cout << "此二叉树为空!";while (pNode != NULL || !s.empty()){while (pNode != NULL){cout << pNode->data << "  ";if(pNode->rchild!=NULL)s.push(pNode->rchild);pNode = pNode->lchild;}if (!s.empty()){pNode = s.top();s.pop();}}cout << endl;}       

中序遍历的非递归算法:

void BinTree_InOrder(BiTree bt){stack<BiTNode*> s;BiTNode* pNode;pNode = bt;if (pNode == NULL)cout << "此二叉树为空!" << endl;while (pNode != NULL || !s.empty()){while (pNode != NULL){s.push(pNode);pNode = pNode->lchild;}if (!s.empty()){pNode = s.top(); s.pop();cout << pNode->data << "  ";pNode = pNode->rchild;}}cout << endl;}

后序遍历的非递归算法:后序遍历的非递归算法与前面两个不一样,它要保证左子树以及右子树都被访问后才能访问根节点,因此与前两个算法相比,要多一些不一样的东西,那就是状态的标记。

struct stackNode {BiTNode* ptr;char tag;};void BinTree_PostOrder(BiTree bt){stack<stackNode> s;BiTNode* pNode;stackNode sNode;pNode = bt;if (bt == NULL){cout << "此二叉树为空!";}do{while (pNode != NULL){sNode.ptr = pNode;sNode.tag = 'L';s.push(sNode);pNode = pNode->lchild;}while (!s.empty() && s.top().tag=='R'){sNode = s.top(); s.pop();pNode = sNode.ptr;cout << pNode->data << "  ";}if (!s.empty()){sNode = s.top();pNode = sNode.ptr;s.top().tag = 'R';//遍历右子树pNode =pNode->rchild;}} while (!s.empty());cout << endl;}

层次遍历无法用递归算法来实现,必须借助一个辅助队列
void BinTree_Level(BiTree bt){deque<BiTNode*> d;BiTNode* p;if (bt == NULL)cout << "此二叉树为空!" << endl;if (bt != NULL){d.push_back(bt);}while (!d.empty()){p = d.front();d.pop_front();cout << p->data << "  ";if (p->lchild != NULL){d.push_back(p->lchild);}if (p->rchild != NULL){d.push_back(p->rchild);}}cout << endl;}

哈哈,第一次写博客,没想到竟然这么累。后面还有一些对二叉树的操作的算法没力气写了大笑

        

        

 
阅读全文
0 0
原创粉丝点击