二叉树递归遍历与非递归遍历

二叉树递归遍历与非递归遍历



引言

由于二叉树是由递归定义的一种数据结构,因此递归式遍历也就是最符直觉的一种遍历方式。此外,由于递归的简洁性以及三种递归的高度统一,因此递归式遍历也是容易理解以及最简单好记的方式。然而,递归也会有其缺点,例如当一颗二叉树的深度很深的适合,采用递归的方式便有可能引起segment fault。因此,在必要的时候也需要将二叉树的遍历写成非递归的形式。

首先我们需要生成一棵树,来进行遍历以及测试,树的结构如下所示

BinaryTree

树结构节点定义如下:

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 
<
  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值