fbpx
维基百科

树的遍历

计算机科学裡,树的遍历(也称为树的走訪树的搜索)是一种圖的遍歷,指的是按照某种规则,不重复地访问某种的所有节点的过程。具体的访问操作可能是检查节点的值、更新节点的值等。不同的遍历方式,其访问节点的顺序是不一样的。以下虽然描述的是二叉树的遍历算法,但它们也适用于其他树形结构。

遍历的种类

与那些基本上都有标准遍历方式(通常是按线性顺序)的线性数据结构(如链表、一维数组)所不同的是,树结构有多种不同的遍历方式。从二叉树的根节点出发,节点的遍历分为三个主要步骤:对当前节点进行操作(称为“访问”节点)、遍历左边子节点、遍历右边子节点。这三个步骤的先后顺序也是不同遍历方式的根本区别。

由于从给定的某个节点出发,有多个可以前往的下一个节点(树不是线性数据结构),所以在顺序计算(即非并行计算)的情况下,只能推迟对某些节点的访问——即以某种方式保存起来以便稍后再访问。常见的做法是采用堆栈(LIFO)或队列(FIFO)。由于树本身是一种自我引用(即递归定义)的数据结构,因此很自然也可以用递归方式,或者更准确地说,用共递归,来实现延迟节点的保存。这时(采用递归的情况)这些节点被保存在呼叫堆疊中。

遍历方式的命名,源于其访问节点的顺序。最简单的划分:是深度优先(先访问子节点,再访问父节点,最后是第二个子节点)?还是广度优先(先访问第一个子节点,再访问第二个子节点,最后访问父节点)? 深度优先可进一步按照根节点相对于左右子节点的访问先后来划分。如果把左节点和右节点的位置固定不动,那么根节点放在左节点的左边,称为前序(pre-order)、根节点放在左节点和右节点的中间,称为中序(in-order)、根节点放在右节点的右边,称为后序(post-order)。对广度优先而言,遍历没有前序中序后序之分:给定一组已排序的子节点,其“广度优先”的遍历只有一种唯一的结果。

深度优先遍历

分作前序走訪中序走訪后序走訪,前、中、後代表根節點在走訪時的位置。以下透過C語言實作,並均使用递归方法。

前序遍历

 
深度优先遍历(前序遍历)
F, B, A, D, C, E, G, I, H.

前序遍历(Pre-Order Traversal)是依序以根節點、左節點、右節點為順序走訪的方式。 其遍歷順序是:

1
2

3

4

5

void pre_order_traversal(TreeNode *root) {  // Do Something with root  if (root->lchild != NULL) //若其中一側的子樹非空則會讀取其子樹  pre_order_traversal(root->lchild);  if (root->rchild != NULL) //另一側的子樹也做相同事  pre_order_traversal(root->rchild); } 

中序遍历

 
深度优先遍历(中序遍历)
A, B, C, D, E, F, G, H, I.

中序遍历(In-Order Traversal)是依序以左節點、根節點、右節點為順序走訪的方式。 其遍歷順序是:

4
2

1

3

5

void in_order_traversal(TreeNode *root) {  if (root->lchild != NULL) //若其中一側的子樹非空則會讀取其子樹  in_order_traversal(root->lchild);  // Do Something with root  if (root->rchild != NULL) //另一側的子樹也做相同事  in_order_traversal(root->rchild); } 

后序遍历

 
深度优先搜索(后序遍历):
A, C, E, D, B, H, I, G, F.

后序遍历(Post-Order Traversal)是依序以左節點、右節點、根節點為順序走訪的方式。 其遍歷順序是:

5
3

1

2

4

void post_order_traversal(TreeNode *root) {  if (root->lchild != NULL) //若其中一側的子樹非空則會讀取其子樹  post_order_traversal(root->lchild);  if (root->rchild != NULL) //另一側的子樹也做相同事  post_order_traversal(root->rchild);  // Do Something with root } 

广度优先遍历

和深度优先遍历不同,广度优先遍历会先访问离根节点最近的节点。二叉树的广度优先遍历又称按层次遍历。算法借助队列实现。 其遍歷順序是:

1
2

4

5

3

 
广度优先遍历 - 层次遍历:
F, B, G, A, D, I, C, E, H.
void level(TreeNode *node) {  Queue *queue = initQueue();  enQueue(queue, node);   while (!isQueueEmpty(queue))  {  TreeNode *curr = deQueue(queue);   // Do Something with curr   if (curr->lchild != NULL)  enQueue(queue, curr->lchild);  if (curr->rchild != NULL)  enQueue(queue, curr->rchild);  } } 

多叉树的遍历

深度优先遍历

先訪問根結點,後選擇一子結點訪問並訪問該節點的子結點,持續深入後再依序訪問其他子樹,可以輕易用遞迴的方式實現。

void travel(treenode* nd){  for(treenode* nex : nd->childs){ //childs存放指向其每個子結點的指標  travel(nex);   }  return; } 

参见

参考資料

树的遍历, 此條目需要擴充, 2010年10月3日, 请協助改善这篇條目, 更進一步的信息可能會在討論頁或扩充请求中找到, 请在擴充條目後將此模板移除, 在计算机科学裡, 也称为树的走訪或树的搜索, 是一种圖的遍歷, 指的是按照某种规则, 不重复地访问某种樹的所有节点的过程, 具体的访问操作可能是检查节点的值, 更新节点的值等, 不同的遍历方式, 其访问节点的顺序是不一样的, 以下虽然描述的是二叉算法, 但它们也适用于其他树形结构, 目录, 遍历的种类, 深度优先遍历, 前序遍历, 中序遍历, 后序遍历, 广度优先. 此條目需要擴充 2010年10月3日 请協助改善这篇條目 更進一步的信息可能會在討論頁或扩充请求中找到 请在擴充條目後將此模板移除 在计算机科学裡 树的遍历 也称为树的走訪或树的搜索 是一种圖的遍歷 指的是按照某种规则 不重复地访问某种樹的所有节点的过程 具体的访问操作可能是检查节点的值 更新节点的值等 不同的遍历方式 其访问节点的顺序是不一样的 以下虽然描述的是二叉树的遍历算法 但它们也适用于其他树形结构 目录 1 遍历的种类 1 1 深度优先遍历 1 1 1 前序遍历 1 1 2 中序遍历 1 1 3 后序遍历 1 2 广度优先遍历 2 多叉树的遍历 2 1 深度优先遍历 3 参见 4 参考資料遍历的种类 编辑与那些基本上都有标准遍历方式 通常是按线性顺序 的线性数据结构 如链表 一维数组 所不同的是 树结构有多种不同的遍历方式 从二叉树的根节点出发 节点的遍历分为三个主要步骤 对当前节点进行操作 称为 访问 节点 遍历左边子节点 遍历右边子节点 这三个步骤的先后顺序也是不同遍历方式的根本区别 由于从给定的某个节点出发 有多个可以前往的下一个节点 树不是线性数据结构 所以在顺序计算 即非并行计算 的情况下 只能推迟对某些节点的访问 即以某种方式保存起来以便稍后再访问 常见的做法是采用堆栈 LIFO 或队列 FIFO 由于树本身是一种自我引用 即递归定义 的数据结构 因此很自然也可以用递归方式 或者更准确地说 用共递归 来实现延迟节点的保存 这时 采用递归的情况 这些节点被保存在呼叫堆疊中 遍历方式的命名 源于其访问节点的顺序 最简单的划分 是深度优先 先访问子节点 再访问父节点 最后是第二个子节点 还是广度优先 先访问第一个子节点 再访问第二个子节点 最后访问父节点 深度优先可进一步按照根节点相对于左右子节点的访问先后来划分 如果把左节点和右节点的位置固定不动 那么根节点放在左节点的左边 称为前序 pre order 根节点放在左节点和右节点的中间 称为中序 in order 根节点放在右节点的右边 称为后序 post order 对广度优先而言 遍历没有前序中序后序之分 给定一组已排序的子节点 其 广度优先 的遍历只有一种唯一的结果 深度优先遍历 编辑 分作前序走訪 中序走訪 后序走訪 前 中 後代表根節點在走訪時的位置 以下透過C語言實作 並均使用递归方法 前序遍历 编辑 深度优先遍历 前序遍历 F B A D C E G I H 前序遍历 Pre Order Traversal 是依序以根節點 左節點 右節點為順序走訪的方式 其遍歷順序是 1 2 3 4 5 void pre order traversal TreeNode root Do Something with root if root gt lchild NULL 若其中一側的子樹非空則會讀取其子樹 pre order traversal root gt lchild if root gt rchild NULL 另一側的子樹也做相同事 pre order traversal root gt rchild 中序遍历 编辑 深度优先遍历 中序遍历 A B C D E F G H I 中序遍历 In Order Traversal 是依序以左節點 根節點 右節點為順序走訪的方式 其遍歷順序是 4 2 1 3 5 void in order traversal TreeNode root if root gt lchild NULL 若其中一側的子樹非空則會讀取其子樹 in order traversal root gt lchild Do Something with root if root gt rchild NULL 另一側的子樹也做相同事 in order traversal root gt rchild 后序遍历 编辑 深度优先搜索 后序遍历 A C E D B H I G F 后序遍历 Post Order Traversal 是依序以左節點 右節點 根節點為順序走訪的方式 其遍歷順序是 5 3 1 2 4 void post order traversal TreeNode root if root gt lchild NULL 若其中一側的子樹非空則會讀取其子樹 post order traversal root gt lchild if root gt rchild NULL 另一側的子樹也做相同事 post order traversal root gt rchild Do Something with root 广度优先遍历 编辑 和深度优先遍历不同 广度优先遍历会先访问离根节点最近的节点 二叉树的广度优先遍历又称按层次遍历 算法借助队列实现 其遍歷順序是 1 2 4 5 3 广度优先遍历 层次遍历 F B G A D I C E H void level TreeNode node Queue queue initQueue enQueue queue node while isQueueEmpty queue TreeNode curr deQueue queue Do Something with curr if curr gt lchild NULL enQueue queue curr gt lchild if curr gt rchild NULL enQueue queue curr gt rchild 多叉树的遍历 编辑深度优先遍历 编辑先訪問根結點 後選擇一子結點訪問並訪問該節點的子結點 持續深入後再依序訪問其他子樹 可以輕易用遞迴或棧的方式實現 void travel treenode nd for treenode nex nd gt childs childs存放指向其每個子結點的指標 travel nex return 参见 编辑树 数据结构 图的遍历 算法导论 计算机程序设计艺术 参考資料 编辑 取自 https zh wikipedia org w index php title 树的遍历 amp oldid 77439961, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。