(1)采用二叉链表存储结构,完成二叉树的层次遍历,先序遍历的非递归算法和中序遍历的非递归算法。
时间: 2023-06-20 15:07:43 浏览: 106
以二叉链表作存储结构,实现先根遍历算法
二叉链表存储结构是二叉树的常见存储方式,每个节点包括数据域、左子节点指针和右子节点指针。以下是二叉树的层次遍历、先序遍历和中序遍历的非递归算法实现。
1. 层次遍历
层次遍历需要借助队列来实现。从根节点开始,先将根节点入队,然后不断从队列中弹出节点,输出其数据域,同时将其左右子节点入队,直到队列为空。
```
void levelOrderTraversal(BiTree T){
if(T == NULL) return;
queue<BiTree> q;
q.push(T);
while(!q.empty()){
BiTree node = q.front();
q.pop();
cout << node->data << " ";
if(node->left) q.push(node->left);
if(node->right) q.push(node->right);
}
}
```
2. 先序遍历
先序遍历的非递归实现需要借助栈来实现。从根节点开始,将其压入栈中。然后不断从栈中弹出节点,输出其数据域,并将其右子节点压入栈中,再将其左子节点压入栈中。由于栈是先进后出的数据结构,所以先压入左子节点,保证左子节点先被访问。
```
void preOrderTraversal(BiTree T){
if(T == NULL) return;
stack<BiTree> s;
s.push(T);
while(!s.empty()){
BiTree node = s.top();
s.pop();
cout << node->data << " ";
if(node->right) s.push(node->right);
if(node->left) s.push(node->left);
}
}
```
3. 中序遍历
中序遍历的非递归实现也需要借助栈来实现。从根节点开始,将其压入栈中,然后不断将其左子节点压入栈中,直到最左子节点。然后从栈中弹出节点,输出其数据域,并将其右子节点压入栈中,进行下一轮循环。
```
void inOrderTraversal(BiTree T){
if(T == NULL) return;
stack<BiTree> s;
BiTree node = T;
while(node != NULL || !s.empty()){
while(node != NULL){
s.push(node);
node = node->left;
}
node = s.top();
s.pop();
cout << node->data << " ";
node = node->right;
}
}
```
阅读全文