按层次遍历二叉树

本文介绍了一种使用双端队列来实现二叉树层次遍历的方法。通过交替使用两个双端队列,可以方便地按层次顺序打印出二叉树的节点数据。该算法首先将根节点加入到第一个队列中,然后依次处理每个队列,直到队列为空。每次处理完一个队列后,都会将其内容全部转移到另一个队列中继续处理。
void PrintNodeByLevel3(Node *root)
{
    deque<Node*>q1,q2;
    q1.push_back(root);
    while(!q1.empty())
    {
        while(!q1.empty())
        {
            Node *node=q1.front();
            q1.pop_front();
            cout<<node->data<<" ";
            if(node->left)
                q2.push_back(node->left);
        if(node->right)
                q2.push_back(node->right);

        }
        cout<<endl;
        q1.swap(q2);
    }


}

### 回答1: 以下是 C 语言按层次遍历二叉树的代码,供您参考: ``` #include <stdio.h> #include <stdlib.h> struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; }; struct QueueNode { struct TreeNode *node; struct QueueNode *next; }; void level_order_traversal(struct TreeNode *root) { if (root == NULL) { return; } // 创建队列 struct QueueNode *front = NULL; struct QueueNode *rear = NULL; // 根节点入队 struct QueueNode *node = (struct QueueNode *) malloc(sizeof(struct QueueNode)); node->node = root; node->next = NULL; front = node; rear = node; // 不断遍历队列 while (front != NULL) { // 取出队首节点 struct TreeNode *current_node = front->node; front = front->next; free(node); // 输出该节点的值 printf("%d ", current_node->data); // 如果有左子节点,入队 if (current_node->left != NULL) { node = (struct QueueNode *) malloc(sizeof(struct QueueNode)); node->node = current_node->left; node->next = NULL; rear->next = node; rear = node; } // 如果有右子节点,入队 if (current_node->right != NULL) { node = (struct QueueNode *) malloc(sizeof(struct QueueNode)); node->node = current_node->right; node->next = NULL; rear->next = node; rear = node; } } } // 测试 int main() { // 构建二叉树 struct TreeNode node1 = {1, NULL, NULL}; struct TreeNode node2 = {2, NULL, NULL}; struct TreeNode node3 = {3, NULL, NULL}; struct TreeNode node4 = {4, NULL, NULL}; struct TreeNode node5 = {5, NULL, NULL}; struct TreeNode node6 = {6, NULL, NULL}; struct TreeNode node7 = {7, NULL, NULL}; node1.left = &node2; node1.right = &node3; node2.left = &node4; node2.right = &node5; node3.left = &node6; node3.right = &node7; // 按层次遍历二叉树 level_order_traversal(&node1); return 0; } ``` 注意,如果您有任何关于该代码的疑问或需求,请随时告诉我,我将竭诚为您服务。 ### 回答2: 按层次遍历二叉树是一种广度优搜索的方法,可以使用队列来实现。下面是C语言实现按层次遍历二叉树的代码: ```c #include <stdio.h> #include <stdlib.h> // 二叉树节点结构体 typedef struct Node { int data; // 节点数据 struct Node* left; // 左子节点指针 struct Node* right; // 右子节点指针 } Node; // 创建新节点 Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); // 分配内存空间 newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 按层次遍历二叉树 void levelOrderTraversal(Node* root) { if (root == NULL) return; // 创建队列,并将根节点入队 Node** queue = (Node**)malloc(sizeof(Node*)); int front = 0; // 队列头指针 int rear = 0; // 队列尾指针 queue[rear++] = root; while (front < rear) { Node* current = queue[front++]; // 出队队首元素 // 访问当前节点 printf("%d ", current->data); // 将当前节点的左右子节点入队 if (current->left != NULL) queue[rear++] = current->left; if (current->right != NULL) queue[rear++] = current->right; } // 释放队列内存空间 free(queue); } int main() { // 创建示例二叉树 Node* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); // 按层次遍历二叉树 printf("按层次遍历二叉树结果:"); levelOrderTraversal(root); return 0; } ``` 上述代码中,首定义二叉树节点的结构体,包含节点数据、左子节点指针和右子节点指针。然后,定义了用于创建新节点的函数`createNode()`。接下来,定义了按层次遍历二叉树的函数`levelOrderTraversal()`。在该函数中,创建了一个队列并将根节点入队,然后进行循环操作直到队列为空。在每一轮循环中,首将队首元素出队并访问,然后将其左右子节点入队。最后,在主函数中创建了示例二叉树并调用`levelOrderTraversal()`函数来按层次遍历二叉树,并将结果打印输出。 ### 回答3: 按层次遍历二叉树的代码可以使用队列来实现。首二叉树的根节点入队,然后开始循环,直到队列为空。在循环中,取出队列的首个节点,访问该节点,并将其左右子节点分别入队。这样就可以保证按照层次遍历的顺依次访问二叉树的每个节点。 下面是C语言实现按层次遍历二叉树的代码: ```c #include <stdio.h> #include <stdlib.h> // 二叉树节点的定义 typedef struct Node { int data; struct Node* left; struct Node* right; } Node; // 创建新节点 Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); if (newNode == NULL) { printf("内存分配失败"); exit(1); } newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 按层次遍历二叉树 void levelOrderTraversal(Node* root) { // 创建一个队列用于存储节点 Node* queue[100]; int front = 0; // 队列的头指针 int rear = 0; // 队列的尾指针 // 根节点入队 queue[rear++] = root; while (front < rear) { Node* current = queue[front++]; printf("%d ", current->data); // 左右子节点入队 if (current->left != NULL) { queue[rear++] = current->left; } if (current->right != NULL) { queue[rear++] = current->right; } } } int main() { // 创建二叉树 Node* root = createNode(1); root->left = createNode(2); root->right = createNode(3); root->left->left = createNode(4); root->left->right = createNode(5); root->right->left = createNode(6); root->right->right = createNode(7); // 按层次遍历二叉树 printf("按层次遍历二叉树结果:"); levelOrderTraversal(root); return 0; } ``` 以上代码首创建了一个二叉树,并使用`levelOrderTraversal`函数按照层次遍历的顺输出二叉树节点的值。最后运行程即可得到按层次遍历二叉树的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值