关于二叉树四种遍历方式以及一些基本操作的方法总结
来源:互联网 发布: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
- 关于二叉树四种遍历方式以及一些基本操作的方法总结
- 查找二叉树的基本操作以及层次遍历
- 关于kali开机自动启动ssh服务的方法以及配置kalissh的一些基本操作
- 二叉树的构造(二叉链表)、遍历以及基本操作
- 二叉树的基本操作及遍历
- 二叉树的基本操作和遍历
- 关于二叉树遍历的一些思考
- 二叉树学习总结:二叉树的基本操作、遍历二叉树、中序线索化二叉树、中序遍历线索二叉树
- 二叉树的遍历方式总结
- 二叉树的创建以及遍历方法
- JS实现二叉查找树的建立以及一些遍历方法
- 二叉搜索树的一些基本操作
- 二叉树的一些基本操作
- 二叉树的一些基本操作
- 二叉搜索树的一些基本操作
- 二叉树的一些基本操作
- 二叉树的一些基本操作
- 递归创建二叉树以及一些基本操作
- 安卓自动化测试之uiautomator(Python篇)四 Uisecltor
- 欢迎使用CSDN-markdown编辑器
- MySQL 必知必会 学习笔记三
- Scala学习笔记——20170819
- redis发布订阅java代码实现
- 关于二叉树四种遍历方式以及一些基本操作的方法总结
- Python两个内置函数——locals 、globals 和命名空间说明
- python数据分析(1)——获取微信好友的统计信息
- 人生无题
- B. Inna and Nine----思维题
- 埃筛(区间筛)
- composer使用self-update时zlib_decode()
- [支付宝小程序PHP全栈开发]一、开发前准备工作支付宝小程序注册
- Linux lspci查看硬件设备