编写按层次顺序遍历二叉树的算法
时间: 2023-11-20 16:07:38 浏览: 103
很高兴回答你的问题!以下是按层次遍历二叉树的算法:
1. 首先,将二叉树的根节点插入队列中。
2. 对于每个队列中的节点,按照从左到右的顺序依次访问,并且将每个节点的左右子节点插入队列中。
3. 重复执行第2步,直到队列为空。
至于你之前和我说了什么,我来给你讲个笑话吧:为什么程序员喜欢用黑色主题?因为他们更喜欢在黑暗中敲代码。哈哈哈,开个玩笑,希望你喜欢!
相关问题
以二叉链表作为二叉树的存储结构,编写用层次顺序遍历二叉树的方法,统计树中度为1 的结点个数。
下面是使用二叉链表存储结构的二叉树层次遍历和统计度为1节点个数的代码实现(C++):
```c++
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 层次遍历二叉树
void levelOrder(TreeNode* root) {
if (root == NULL) return;
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left) q.push(node->left);
if (node->right) q.push(node->right);
}
cout << endl;
}
}
// 统计度为1节点个数
int countDegreeOne(TreeNode* root) {
if (root == NULL) return 0;
int count = 0;
if ((root->left == NULL && root->right != NULL) || (root->left != NULL && root->right == NULL)) {
count = 1;
}
count += countDegreeOne(root->left) + countDegreeOne(root->right);
return count;
}
int main() {
// 创建二叉树
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
root->right->left = new TreeNode(6);
root->right->right = new TreeNode(7);
// 层次遍历二叉树
levelOrder(root);
// 统计度为1节点个数
int count = countDegreeOne(root);
cout << "The number of nodes with degree 1 is: " << count << endl;
return 0;
}
```
这里我们使用了“层次遍历”算法来遍历二叉树。具体来说,我们使用队列来存储每一层的节点,然后依次访问队列中的节点,并将它们的子节点(如果有的话)入队。这样我们就可以按照从上到下、从左到右的顺序遍历整棵树。
统计度为1节点个数的算法非常简单。对于每个节点,如果它只有一个子节点(即左子节点或右子节点不为空),那么它就是度为1的节点。我们可以使用递归算法来遍历整棵树,并统计符合条件的节点个数。
以上就是使用二叉链表存储结构的二叉树层次遍历和统计度为1节点个数的代码实现。
用二叉链表作为存储结构,建立- -棵二叉树。分别按先序、中序、后序和层次顺序遍历二叉树。按中序顺序非递归遍历二叉树编写交换二叉树中所 有结点的左、右孩子的非递归算法。
好的,我已经接收到您的问题。以下是我的回答:
建立二叉树的过程主要包括创建二叉链表和构建二叉树两个操作。创建二叉链表是指为二叉树中的每个结点建立一个数据域和两个指针域,指针域分别指向该结点的左右子节点。
构建二叉树是指根据用户输入的数据和指针关系构建二叉树的过程。建立一棵二叉树可以采用递归算法,代码如下:
```
typedef struct Node {
int data;
struct Node *lchild, *rchild;
} Node;
Node* createBinaryTree() {
int data;
scanf("%d", &data);
if (data == -1) {
return NULL;
}
Node *root = (Node*) malloc(sizeof(Node));
root->data = data;
root->lchild = createBinaryTree();
root->rchild = createBinaryTree();
return root;
}
```
其中,输入的-1表示当前结点没有子树。根据此递归规则输入一段序列即可建立一棵二叉树。
以下是先序、中序、后序和层次遍历的代码实现:
```
void preOrder(Node *root) { // 先序遍历
if (!root) {
return;
}
printf("%d ", root->data);
preOrder(root->lchild);
preOrder(root->rchild);
}
void inOrder(Node *root) { // 中序遍历
if (!root) {
return;
}
inOrder(root->lchild);
printf("%d ", root->data);
inOrder(root->rchild);
}
void postOrder(Node *root) { // 后序遍历
if (!root) {
return;
}
postOrder(root->lchild);
postOrder(root->rchild);
printf("%d ", root->data);
}
void levelOrder(Node *root) { // 层次遍历
if (!root) {
return;
}
queue<Node*> q;
q.push(root);
while (!q.empty()) {
Node *front = q.front();
printf("%d ", front->data);
if (front->lchild) {
q.push(front->lchild);
}
if (front->rchild) {
q.push(front->rchild);
}
q.pop();
}
}
```
以下是按中序顺序非递归遍历的代码实现:
```
void inOrderTraversal(Node* root) { // 中序遍历非递归算法
stack<Node*> s;
Node *cur = root;
while (!s.empty() || cur) {
if (cur) {
s.push(cur);
cur = cur->lchild;
} else {
cur = s.top();
s.pop();
printf("%d ", cur->data);
cur = cur->rchild;
}
}
}
```
以下是交换二叉树中所有结点的左、右孩子的非递归算法:
```
void swapChild(Node* root) { // 交换二叉树中的左右孩子
if (!root) {
return;
}
stack<Node*> s;
s.push(root);
while (!s.empty()) {
Node *cur = s.top();
s.pop();
Node *temp = cur->lchild;
cur->lchild = cur->rchild;
cur->rchild = temp;
if (cur->lchild) {
s.push(cur->lchild);
}
if (cur->rchild) {
s.push(cur->rchild);
}
}
}
```
以上就是我的全部回答,请问还有其他问题吗?
阅读全文