“树”是一种重要的数据结构,本文浅谈二叉树的遍历问题,采用C语言描述。
树的销毁应从叶子节点开始逐个向上销毁。如采用非递归的方法,可以使用后序
遍历逐个销毁结点,因后序遍历是先叶子结点后根节点的一种方法。
void destroyTree(treeNode *root)
{
if (!root)
{
destroyTree(root‐>left);
destroyTree(root‐>right);
free(root);
}
}
一、二叉树基础
1)定义:有且仅有一个根结点,除根节点外,每个结点只有一个父结点,最多含有两个子节点,子节点有左右之分。
2)存储结构
二叉树的存储结构可以采用顺序存储,也可以采用链式存储,其中链式存储更加灵活。
在链式存储结构中,与线性链表类似,二叉树的每个结点采用结构体表示,结构体包含三个域:数据域、左指针、右指针。
二叉树在C语言中的定义如下:
- structBiTreeNode{
- intc;
- structBiTreeNode*left;
- structBiTreeNode*right;
- };
二、二叉树的遍历
“遍历”是二叉树各种操作的基础。二叉树是一种非线性结构,其遍历不像线性链表那样容易,无法通过简单的循环实现。
二叉树是一种树形结构,遍历就是要让树中的所有节点被且仅被访问一次,即按一定规律排列成一个线性队列。二叉(子)树是一种递归定义的结构,包含三个部分:根结点(N)、左子树(L)、右子树(R)。根据这三个部分的访问次序对二叉树的遍历进行分类,总共有6种遍历方案:NLR、LNR、LRN、NRL、RNL和LNR。研究二叉树的遍历就是研究这6种具体的遍历方案,显然根据简单的对称性,左子树和右子树的遍历可互换,即NLR与NRL、LNR与RNL、LRN与RLN,分别相类似,因而只需研究NLR、LNR和LRN三种即可,分别称为“先序遍历”、“中序遍历”和“后序遍历”。
二叉树遍历通常借用“栈”这种数据结构实现,有两种方式:递归方式及非递归方式。
在递归方式中,栈是由操作系统维护的,用户不必关心栈的细节操作,用户只需关心“访问顺序”即可。因而,采用递归方式实现二叉树的遍历比较容易理解,算法简单,容易实现。
递归方式实现二叉树遍历的C语言代码如下: