树——二叉树的先序、中序和后序遍历

1,二叉树是否只有一种遍历方式(层次遍历)?

2,典型的二叉树的遍历方式:

1,先序遍历(Pre-Order Traversal);

2,中序遍历(In-Order Traversal);

3,后序遍历(Post-Order Traversal);

3,先序遍历(“先序”指最先访问根结点中的数据元素):

  1,二叉树为空:

1,无操作,直接返回;

2,二叉树不为空:

1,访问根结点中的数据元素;

2,先序遍历左子树;

3,先序遍历右子树;

4,先序遍历功能定义及其代码实现:

1,代码示例:

1    preOrderTraversal(node)
2        {
3            if( noe != NULL )
4            {
5                access(node->value);
6                preOrderTraversal(node->left);
7                preOrderTraversal(node->right);
8            }
9        }

  2,功能函数代码实现:

 1    /* 实现先序遍历,队里里面保存的数据元素用来反应遍历时候结点次序 */
 2     void PreOrderTraversal(BTreeNode<T>* node, LinkQueue<BTreeNode<T>*>& queue)
 3     {
 4         if( node != NULL )
 5         {
 6             queue.add(node);  // 访问中间结点
 7             PreOrderTraversal(node->left, queue);
 8             PreOrderTraversal(node->right, queue);
 9         }
10     }

5,中序遍历(“中序”指中间访问根结点中的数据元素):

  1,二叉树为空:

1,无操作,直接返回;

2,二叉树不为空:

1,中序遍历左子树;

2,访问根结点中的数据元素;

3,中序遍历右子树;

6,中序遍历功能定义:

1,代码示例:

1    inOrderTraversal(node)
2        {
3            if(node != NULL)
4            {
5                inOrderTraversal(node->left);
6                access(node->value);
7                inOrderTraversal(node->right);
8            }
9        }

  2,功能函数代码实现:

 1    /* 实现中序遍历,队里里面保存的数据元素用来反应遍历时候结点次序  */
 2     void inOrderTraversal(BTreeNode<T>* node, LinkQueue<BTreeNode<T>*>& queue)
 3     {
 4         if( node != NULL )
 5         {
 6             inOrderTraversal(node->left, queue);
 7             queue.add(node);  // 访问中间结点
 8             inOrderTraversal(node->right, queue);
 9         }
10     }

7,后续遍历(“后序”指最后访问根结点中的数据元素):

1,二叉树为空:

1,无操作,直接返回;

2,二叉树不为空:

1,后序遍历左子树;

2,后序遍历右子树;

3,访问根结点中的数据元素;

8,后续遍历功能定义:

1,代码示例:

1    postOrderTraversal(node)
2        {
3            if( node != NULL )
4            {
5                postOrderTraversal(node->left);
6                postOrderTraversal(node->right);
7                access(node->value);
8            }
9        }

  2,功能函数代码实现:

 1    /* 实现后序遍历,队里里面保存的数据元素用来反应遍历时候结点次序  */
 2     void postOrderTraversal(BTreeNode<T>* node, LinkQueue<BTreeNode<T>*>& queue)
 3     {
 4         if( node != NULL )
 5         {
 6             postOrderTraversal(node->left, queue);
 7             postOrderTraversal(node->right, queue);
 8             queue.add(node);  // 访问中间结点
 9         }
10     }

9,需要考虑的问题:

1,是否可以将二叉树的典型便利算法集成到 BTree 中?如果可以,代码需要做怎样的改动?

10,设计要点:

1,不能与层次遍历函数冲突,必须设计新的函数接口;

2,算法执行完成后,能够方便的获取遍历结果;

3,遍历结果能够反映结点访问的先后次序;

11,函数接口设计:

1,SharedPointer<Array<T> > traversal(BTTraversal order):

1,根据参数 order 选择执行遍历算法(先序,中序,后序);

2,返回值为堆空间中的数组对象(生命周期由智能指针管理);

3,数组元素的次序反映遍历的先后次序;

12,典型遍历示例:

13,遍历算法成员函数实现:

 1,定义遍历方式:
1 /* 定义排序的方式 */
2 enum BTTraversal
3 {
4     PreOrder,
5     InOrder,
6     PostOrder,
7     LevelOrder  // 重构了“树——二叉树线索化”中的层次遍历次序
8 };

  2,遍历的功能函数:

 1    /* 遍历的功能函数,第二个参数用于保存访问时,结点的先后顺序 */
 2     void traversal(BTTraversal order, LinkQueue<BTreeNode<T>*>& queue)
 3     {
 4         switch(order)
 5         {
 6             case PreOrder:
 7                 PreOrderTraversal(root(), queue);
 8                 break;
 9             case InOrder:
10                 inOrderTraversal(root(), queue);
11                 break;
12             case PostOrder:
13                 postOrderTraversal(root(), queue);
14                 Break;
15             default:
16                 THROW_EXCEPTION(InvalidParameterException, "Parameter order is invalid ...");
17                 break;
18         }
19     }

  3,遍历的实现:

 1    /* 典型的二叉树遍历,前序、中序、后续 */
 2     SharedPointer< Array<T> > traversal(BTTraversal order)
 3     {
 4         DynamicArray<T>* ret = NULL;
 5         LinkQueue<BTreeNode<T>*> queue;  // 保存遍历结点次序,用 queue 来传递元素的值是一个很好的抉择;
 6
 7         traversal(order, queue);  // 执行功能函数
 8
 9         ret = new DynamicArray<T>(queue.length());  // 申请动态数组
10
11         if( ret != NULL )  // 保存遍历所得的动态数组
12         {
13         /* 将队列中,结点里面数据元素的值,依次放到返回数组里面 */
14             for(int i=0; i<ret->length(); i++, queue.remove()) // 这里不要忘了将队列依次删除首元素
15             {
16                 ret->set(i, queue.front()->value);  // 将结点里面数据元素值依次放到返回数组里面
17             }
18         }
19         else
20         {
21             THROW_EXCEPTION(NoEnoughMemoryException, "No memory to create return array ...");
22         }
23
24         return  ret;
25     }

14,小结:

1,二叉树的典型遍历都是以递归方式执行的;

2,BTree 以不同的函数接口支持典型遍历;

3,层次遍历与典型遍历互不冲突;

4,遍历结果能够反映树结点访问的先后次序;

原文地址:https://www.cnblogs.com/dishengAndziyu/p/10926052.html

时间: 2024-08-05 02:46:32

树——二叉树的先序、中序和后序遍历的相关文章

经典白话算法之二叉树中序前序序列(或后序)求解树

这种题一般有二种形式,共同点是都已知中序序列.如果没有中序序列,是无法唯一确定一棵树的. <1>已知二叉树的前序序列和中序序列,求解树. 1.确定树的根节点.树根是当前树中所有元素在前序遍历中最先出现的元素. 2.求解树的子树.找出根节点在中序遍历中的位置,根左边的所有元素就是左子树,根右边的所有元素就是右子树.若根节点左边或右边为空,则该方向子树为空:若根节点 边和右边都为空,则根节点已经为叶子节点. 3.递归求解树.将左子树和右子树分别看成一棵二叉树,重复1.2.3步,直到所有的节点完成定

已知二叉树的中序序列为DBGEAFC,后序序列为DGEBFCA,给出相应的二叉树

面对这种问题时我们该怎么解决? 今天写数据结构题.发现了一道总是碰见问题的题在这里我写了一种求解方法我自己称它为分层递归求解. 第一步通过观察我们知道后序遍历时最后一个是根节点A 在中序序列中A的左边是左子树右边是右子树 第二步我们来画第一层为根节点的右子树为A-C-F watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc29uZ2p1bnlhbg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolv

二叉树的遍历,递归,迭代,层序,中序,前序,后序

#include<stdio.h> #include<stdlib.h> #include<queue> #include<stack> #include<iostream> using namespace std; struct node{ int key; node *left, *right; }; void insertTree(node* &root,int val) { node* tmp = (node*)malloc(si

输入层次遍历,输出中序,前序,后序遍历

题目描述 输入完全二叉树的层次遍历序列,输出该完全二叉树的中序遍历序列. 例如下面二叉树的层次遍历序列为“ABCDE",中序遍历为"DBEAC". A /    \ B      C /    \ D     E 遍历数采用递归写法,无需多说:而且前,中,后,皆为一法: 重要的是看怎么建立一个二叉树,且听分解: //输入层次遍历输出中序 #include <cstdio>#include <cstdlib>#include <cstring>

根据中序遍历和后序遍历树构造二叉树

样例: 给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2] 返回如下的树: 2 /  \ 1   3 借鉴上一篇<前序遍历和中序遍历树构造二叉树>,我们知道中序遍历为左->中->右,后序遍历为左->右->中.于是后序遍历的最后一个值即为根节点的值,根据这个值我们在中序遍历中找到根节点左子树和右子树的值,递归构造左子树和右子树即可. /** * Definition of TreeNode: * class TreeNode { * public: * in

【基础备忘】 二叉树前序、中序、后序遍历相互求法

转自:http://www.cnblogs.com/fzhe/archive/2013/01/07/2849040.html 今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性: 前序遍历:     1.访问根节点     2.前序遍历左子树     3.前序遍历右子树 中序遍历:     1.中序遍历左子树     2

二叉树前序、中序、后序遍历相互求法

今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性: 前序遍历:     1.访问根节点     2.前序遍历左子树     3.前序遍历右子树 中序遍历:     1.中序遍历左子树     2.访问根节点     3.中序遍历右子树 后序遍历:     1.后序遍历左子树     2.后序遍历右子树     3.访问

【转】二叉树前序、中序、后序遍历相互求法

今天来总结下二叉树前序.中序.后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明. 首先,我们看看前序.中序.后序遍历的特性: 前序遍历:     1.访问根节点     2.前序遍历左子树     3.前序遍历右子树 中序遍历:     1.中序遍历左子树     2.访问根节点     3.中序遍历右子树 后序遍历:     1.后序遍历左子树     2.后序遍历右子树     3.访问

二叉树的遍历规则(前序遍历、后序遍历、中序遍历)

今天看了一些关于平和查找二叉树的问题,顺便也复习了一下二叉树的遍历规则,写一下学习文档. 树的遍历顺序大体分为三种:前序遍历(先根遍历.先序遍历),中序遍历(中根遍历),后序遍历(后根遍历). 如图所示二叉树: 前序遍历:前序遍历可以记为根左右,若二叉树为空,则结束返回. 前序遍历的规则: (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 这里需要注意:在完成第2,3步的时候,也是要按照前序遍历二叉树的规则完成. 前序遍历的输出结果:ABDECF 中序遍历:中序遍历可以记为左根右,也