数据结构-前序遍历、中序遍历、后序遍历、层级遍历(递归、非递归)

二叉树的遍历是一个非常基础又重要的内容。遍历就是访问二叉树中的每一个节点,并且每个节点只访问一次。二叉树的遍历分为前序遍历、中序遍历、后序遍历和层级遍历。

前序遍历

前序遍历的顺序是:根节点 -> 左子节点 -> 右子节点。

这里写图片描述

上图二叉树的前序遍历结果是: ABCDEFGH

递归实现

按照前序遍历的顺序,可以非常快写出其递归实现

void PreOrderTraverseRec (Node* root) {

    if (root != NULL) {
        printf("%d ", root->val);
        PreOrderTraverseRec (root->left);
        PreOrderTraverseRec (root->right);
    }
}

非递归实现

前序遍历的非递归实现可以使用栈模拟。

版本1

其实在前序遍历的内部实现,每次遍历一个节点后,接下来先遍历这个节点的左子节点,对这个左子节点将其看成根节点,又递归遍历其左子节点,直到访问到叶节点。将叶节点弹栈,得到其父节点。因为已经访问过父节点,以及父节点的左子节点,所以接下来应该按照上述方法递归访问父节点的右子树。

void PreOrderTraverseNonRec (Node* root) {

    if (root == NULL) {
        printf("empty tree!\n");
        return;
    } else {

        //method 1
        stack<Node*> s;
        Node* p = root;

        while ( p != NULL || !s.empty()) {

            while (p != NULL) {
                printf("%d ", p->val);
                s.push (p);
                p = p->left;
            }

            if (!s.empty()) {
                p = s.top ();
                s.pop ();
                p = p->right;
            }
        }
    }
}

版本2

还有另外一种更加简洁的用

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值