二叉树层序遍历递归算法

这个算法的思想是基于队列的层次遍历。层次遍历是一种广度优先搜索(BFS)的算法,它按层级顺序逐层遍历树或图的节点。

层次遍历算法的基本思想是通过使用队列,按照从上到下、从左到右的顺序访问每个节点。具体步骤如下:

  1. 创建一个空队列,并将根节点入队。
  2. 当队列非空时,重复以下步骤:
    • 从队列中取出一个节点。
    • 访问该节点,可以根据需求进行相应的操作,例如打印节点值。
    • 将该节点的左子节点和右子节点依次入队。
  3. 循环结束后,即完成了树或图的层次遍历。

这个算法的关键在于使用队列来保存每一层的节点,并按照从左到右的顺序逐层访问。通过不断将节点的子节点入队,保证了每一层的节点按顺序访问,从而实现了层次遍历的效果。

层次遍历算法的时间复杂度是 O(N),其中 N 是树或图中节点的数量。因为每个节点都会被访问一次,并且每个节点都会被入队和出队一次。层次遍历算法广泛应用于树和图的遍历问题,特别适用于需要按层级顺序处理节点的场景,如查找树的最小深度、查找树的最大宽度等。

#include <iostream>
#include <queue>

using namespace std;

// 二叉树节点结构
struct TreeNode {
    int data;               // 节点数据
    struct TreeNode* lchild;  // 左子节点指针
    struct TreeNode* rchild;  // 右子节点指针
};

typedef struct TreeNode* bitree;   // 定义二叉树指针类型
typedef queue<bitree> Queue;       // 定义队列类型

void visited(bitree node) {
    cout << node->data << " ";  // 输出节点数据
}

void initqueue(Queue& q) {
    while (!q.empty()) {
        q.pop();    // 清空队列
    }
}

void enqueue(Queue& q, bitree item) {
    q.push(item);   // 入队操作
}

void dequeue(Queue& q, bitree& item) {
    item = q.front();   // 获取队头节点
    q.pop();            // 出队操作
}

bool isempty(Queue& q) {
    return q.empty();   // 判断队列是否为空
}

void levelorder(bitree t) {
    bitree p;
    Queue q;
    initqueue(q);       // 初始化队列
    enqueue(q, t);      // 将根节点入队
    while (!isempty(q)) {
        dequeue(q, p);  // 出队一个节点
        visited(p);     // 访问节点
        if (p->lchild != NULL)
            enqueue(q, p->lchild);  // 将左孩子入队
        if (p->rchild != NULL)
            enqueue(q, p->rchild);  // 将右孩子入队
    }
}

// 创建新节点
bitree createNode(int data) {
    bitree newNode = new TreeNode;
    newNode->data = data;
    newNode->lchild = NULL;
    newNode->rchild = NULL;
    return newNode;
}

// 创建二叉树
bitree createBinaryTree() {
    bitree root = createNode(1);
    root->lchild = createNode(1);
    root->rchild = createNode(3);
    root->lchild->lchild = createNode(5);
    root->lchild->rchild = createNode(5);
    root->rchild->lchild = createNode(6);
    root->rchild->rchild = createNode(7);
    return root;
}

int main() {
    bitree root = createBinaryTree();
    cout << "层次遍历结果:";
    levelorder(root);
    cout << endl;

    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值