用二叉链表作为存储结构,建立- -棵二叉树。分别按先序、中序、后序和层次顺序遍历二叉树。按中序顺序非递归遍历二叉树编写交换二叉树中所 有结点的左、右孩子的非递归算法。
时间: 2024-05-14 18:19:43 浏览: 81
编写采用二叉链表形式存储的二叉树的创建、先序、中序、后序和按层遍历的算法
5星 · 资源好评率100%
好的,我已经接收到您的问题。以下是我的回答:
建立二叉树的过程主要包括创建二叉链表和构建二叉树两个操作。创建二叉链表是指为二叉树中的每个结点建立一个数据域和两个指针域,指针域分别指向该结点的左右子节点。
构建二叉树是指根据用户输入的数据和指针关系构建二叉树的过程。建立一棵二叉树可以采用递归算法,代码如下:
```
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);
}
}
}
```
以上就是我的全部回答,请问还有其他问题吗?
阅读全文