创建一棵二叉链表存储结构的二叉树; 2、分别利用先序遍历(递归和非递归)两种算法遍历所建二叉树
时间: 2023-11-09 07:15:58 浏览: 120
二叉树的几种操作,包括递归先序建立二叉树、先序遍历、中序遍历、后序遍历、非递归的各种遍历
5星 · 资源好评率100%
好的,我可以为您解答这个问题。
首先,我们来创建一棵二叉链表存储结构的二叉树。二叉链表存储结构是指每一个节点都包含左右子树的指针,如下所示:
```c
struct Node {
int data;
Node* left;
Node* right;
};
```
我们可以通过递归的方式来创建一棵二叉树,具体实现如下:
```c
Node* createTree() {
int data;
cin >> data;
if (data == -1) { // 输入-1表示该节点为NULL
return NULL;
}
Node* root = new Node;
root->data = data;
root->left = createTree(); // 递归创建左子树
root->right = createTree(); // 递归创建右子树
return root;
}
```
接下来,我们来分别利用先序遍历(递归和非递归)两种算法遍历所建二叉树。
先序遍历是指先遍历根节点,再遍历左子树和右子树。递归实现如下:
```c
void preOrder(Node* root) {
if (root == NULL) {
return;
}
cout << root->data << " ";
preOrder(root->left);
preOrder(root->right);
}
```
非递归实现需要借助栈来辅助实现。具体步骤如下:
1. 将根节点入栈
2. 循环执行以下步骤直到栈为空:
1. 弹出栈顶节点并输出
2. 将栈顶节点的右子节点(如果存在)入栈
3. 将栈顶节点的左子节点(如果存在)入栈
代码实现如下:
```c
void preOrderNonRecursive(Node* root) {
stack<Node*> st;
st.push(root);
while (!st.empty()) {
Node* node = st.top();
st.pop();
if (node == NULL) {
continue;
}
cout << node->data << " ";
st.push(node->right);
st.push(node->left);
}
}
```
这样,我们就完成了题目要求的两个任务。希望能对您有所帮助!
阅读全文