c语言1、采用递归先序算法建立二叉树。要求通过键盘输入二叉树的先序遍历顺序从而建立一棵二叉树。 2、采用递归算法实现显示出二叉树先序、中序和后序遍历顺序。 3、采用非递归算法实现二叉树的先序或中序遍历。
时间: 2024-12-08 17:13:27 浏览: 26
在 C 语言中,递归是一种常用的解决问题技巧,尤其在处理二叉树这类数据结构时。以下是三个关于二叉树操作的问题解答:
1. **建立二叉树 (递归先序)**
使用递归先序遍历来构建二叉树,你需要完成三个步骤:
- 输入第一个节点值并创建新的根结点;
- 对左子树进行递归调用,将先序遍历的结果作为根节点的左子树;
- 对右子树进行同样的递归操作,将剩余元素作为根节点的右子树。
```c
struct Node {
int data;
struct Node* left;
struct Node* right;
};
void createTree(struct Node** root, int arr[], int start, int end) {
if (start > end)
return;
int key = arr[start];
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = key;
*root = newNode;
int i = start + 1;
while (i <= end && arr[i] < key) {
i++;
}
(*root)->right = createTree(&(*root)->right, arr, i, end);
(*root)->left = createTree(&(*root)->left, arr, start + 1, i - 1);
}
```
输入先序遍历数组 `arr` 和边界 `start` 和 `end` 调用此函数即可。
2. **显示遍历顺序 (递归)**
对于先序、中序和后序遍历,可以分别编写递归函数:
- 先序:根-左-右
- 中序:左-根-右
- 后序:左-右-根
```c
void printPreorder(Node* node) {
if (node != NULL) {
printf("%d ", node->data);
printPreorder(node->left);
printPreorder(node->right);
}
}
// 中序和后序类似,只是打印顺序不同
```
3. **非递归遍历 (先序或中序)**
可以使用栈来实现非递归的遍历,比如先序遍历:
- 将根节点压入栈;
- 当栈不为空时,弹出节点并打印,然后将其右子节点(如果有)压入栈,最后处理左子节点(如果还有)。
```c
void nonRecursivePreorder(Node* node) {
stack<Node*> s;
s.push(node);
while (!s.empty()) {
Node* temp = s.top();
s.pop();
printf("%d ", temp->data);
// 非递归遍历左子树
if (temp->left)
s.push(temp->left);
// 遍历右子树,但先存入栈以便按相反顺序访问
if (temp->right)
s.push(temp->right);
}
}
```
对于中序遍历,只需调整存储节点左右子节点的顺序即可。
阅读全文