算法之二叉树各种遍历
来源:互联网 发布:java实现redis集群 编辑:程序博客网 时间:2024/05/22 22:59
注意:
二叉树的深度优先遍历涵盖(中序,前序,后序)遍历(可以分为递归和非递归两种方式);
广度优先遍历也叫层序遍历(借助队列实现)。
树的遍历[编辑]
搜索算法
- α–β
- A*
- B*
- 回溯
- 集束
- 贝尔曼-福特
- 最佳优先
- 双向
- Borůvka
- 分支限界
- BFS
- 大英博物馆
- D*
- DFS
- 深度限制
- 迪杰斯特拉
- Edmonds
- Floyd–Warshall
- 边缘搜索
- 爬山
- IDA*
- 迭代加深
- Johnson
- 跳点
- 克鲁斯克尔
- 字典序BFS
- 普里姆
- SMA*
- 图算法
- 搜索算法
- 动态规划
- 图的遍历
- 树的遍历
在计算机科学里,树的遍历(也称为树的搜索)是graph traversal的一种,指的是按照某种规则,不重复地访问某种tree data structure的所有节点的过程。具体的访问操作可能是检查节点的值、更新节点的值等。不同的遍历方式,其访问节点的顺序是不一样的。以下虽然描述的是二叉树的遍历算法,但它们也适用于其他树形结构。
目录
[隐藏]- 1遍历的种类
- 1.1深度优先遍历
- 1.1.1先序遍历(Pre-Order Traversal)
- 1.1.2中序遍历(In-Order Traversal)
- 1.1.3后序遍历(Post-Order Traversal)
- 1.2广度优先遍历
- 1.1深度优先遍历
- 2多叉树的遍历
- 2.1深度优先遍历
- 2.2广度优先遍历
- 3参考文献
- 4参见
遍历的种类[编辑]
与那些基本上都有标准遍历方式(通常是按线性顺序)的线性数据结构(如链表、一维数组)所不同的是,树结构有多种不同的遍历方式。从二叉树的根节点出发,节点的遍历分为三个主要步骤:对当前节点进行操作(称为“访问”节点)、遍历左边子节点、遍历右边子节点。这三个步骤的先后顺序也是不同遍历方式的根本区别。
由于从给定的某个节点出发,有多个可以前往的下一个节点(树不是线性数据结构),所以在顺序计算(即非并行计算)的情况下,只能推迟对某些节点的访问——即以某种方式保存起来以便稍后再访问。常见的做法是采用栈(LIFO)或队列(FIFO)。由于树本身是一种自我引用(即递归定义)的数据结构,因此很自然也可以用递归方式,或者更准确地说,用corecursion,来实现延迟节点的保存。这时(采用递归的情况)这些节点被保存在call stack中。
遍历方式的命名,源于其访问节点的顺序。最简单的划分:是深度优先(先访问子节点,再访问父节点,最后是第二个子节点)?还是广度优先(先访问第一个子节点,再访问第二个子节点,最后访问父节点)? 深度优先可进一步按照根节点相对于左右子节点的访问先后来划分。如果把左节点和右节点的位置固定不动,那么根节点放在左节点的左边,称为前序(pre-order)、根节点放在左节点和右节点的中间,称为中序(in-order)、根节点放在右节点的右边,称为后序(post-order)。对广度优先而言,遍历没有前序中序后序之分:给定一组已排序的子节点,其“广度优先”的遍历只有一种唯一的结果。
深度优先遍历[编辑]
以下均是用递归方法
先序遍历(Pre-Order Traversal)[编辑]
指先访问根,然后访问孩子的遍历方式,其C代码如下:
void XXBL(tree* root){ //Do Something with root if(root->lchild!=NULL) XXBL(root->lchild); if(root->rchild!=NULL) XXBL(root->rchild);}
中序遍历(In-Order Traversal)[编辑]
指先访问左(右)孩子,然后访问根,最后访问右(左)孩子的遍历方式,其C代码如下
void ZXBL(tree* root){ if(root->lchild!=NULL) ZXBL(root->lchild); //Do Something with root if(root->rchild!=NULL) ZXBL(root->rchild);}
后序遍历(Post-Order Traversal)[编辑]
指先访问孩子,然后访问根的遍历方式,其C代码如下
void HXBL(tree* root){ if(root->lchild!=NULL) HXBL(root->lchild); if(root->rchild!=NULL) HXBL(root->rchild); //Do Something with root}
广度优先遍历[编辑]
和深度优先遍历不同,广度优先遍历会先访问离根节点最近的节点。二叉树的广度优先遍历又称按层次遍历。算法借助队列实现。
void Layer_Traver(tree* root) {
int head = 0,tail = 0; tree* p[SIZE] = {NULL}; tree* tmp; if(root != NULL) { p[head] = root; tail++; //Do Something with p[head] } else { return; } while(head < tail) { tmp = p[head]; if(tmp->left != NULL)//left { p[tail] = tmp->left; tail++; //Do Something with p[head] } if(tmp->right != NULL)//right { p[tail] = tmp->right; tail++; //Do Something with p[head] } head++; } return;
}
多叉树的遍历[编辑]
深度优先遍历[编辑]
广度优先遍历[编辑]
参考文献[编辑]
参见[编辑]
- 树 (数据结构)
- 图遍历
- 《算法导论》
- 《计算机程序设计艺术》
参考博客:
1. http://blog.csdn.net/SJF0115/article/category/910594
2.http://blog.csdn.net/sunnyyoona/article/details/50461575
算法之二叉树各种遍历:
http://blog.csdn.net/sjf0115/article/details/8645991- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 算法之二叉树各种遍历
- 1.1 选择排序:不断地选择剩余元素中的最小(大)者
- 在Android4.4.2模拟器上安装个人证书
- 怎样找到一个新领域内的经典文献?
- svn如何切换用户
- setuptools升级7+引发的错误
- 算法之二叉树各种遍历
- 位运算
- Intellij IDEA 默认打开上次项目设置
- JavaScript效果备忘录之输入后显示提示
- 说说JSON和JSONP,也许你会豁然开朗
- Flash动画制作学习心得
- 分布式(集群)与集群的联系与区别
- newcapec
- 复选框(checkbox)多个选中问题