二叉树递归遍历与非递归遍历
引言
由于二叉树是由递归定义的一种数据结构,因此递归式遍历也就是最符直觉的一种遍历方式。此外,由于递归的简洁性以及三种递归的高度统一,因此递归式遍历也是容易理解以及最简单好记的方式。然而,递归也会有其缺点,例如当一颗二叉树的深度很深的适合,采用递归的方式便有可能引起segment fault
。因此,在必要的时候也需要将二叉树的遍历写成非递归的形式。
首先我们需要生成一棵树,来进行遍历以及测试,树的结构如下所示
树结构节点定义如下:
struct TreeNode
{
int val;
TreeNode * left; //左子树
TreeNode * right; //右子树
TreeNode(int x):val(x),left(NULL),right(NULL)
{
}
};
递归式遍历
树结构本身采用递归式定义,因此采用递归方式遍历也很直观和容易理解,各种遍历方式c++
代码如下
前序遍历
先序遍历按照根节点->左子树->右子树的顺序进行遍历,首先我们先去方位其根节点,如果其存在左子树,便转向左子树遍历,遍历完左子树后,如果存在右子树,便转向右子树遍历,因此其代码如下
void Preorder_Recursive(TreeNode * root)
{
if(!root) //如果遇到空树或到达叶节点的孩子(NULL)
{
return;
}
cout << root->val <<" "; //操作根节点
if(root->left)
{
Preorder_Recursive(root->left); //转向左子树
}
if(root->right)
{
Preorder_Recursive(root->right); //转向右子树
}
}
调用上述函数的输出结果为:
Preorder_Recursive 1 2 4 5 6 8 9 7 3
中序遍历
中序遍历是按照左子树->根节点->右子树的顺序遍历二叉树,因此其代码如下:
void Inorder_Recursive(TreeNode * root)
{
if(!root) //如果遇到空树或到达叶节点的孩子(NULL)
{
return;
}
if(root->left)
{
Inorder_Recursive(root->left); //转向左子树
}
cout << root->val << " "; //操作根节点
if(root->right)
{
Inorder_Recursive(root->right); //转向右子树
}
}
输出结果为:
Inorder_Recursive 4 2 6 8 9 5 7 1 3
<