(1)用c++建立二叉树,节点的结构体为: typedef struct { int num; /学号 char name[10]; /姓名 } student; (2)完成前、中、后二叉树非递归遍历程序; (3)从上至下、从左至右层次遍历程序;从上至下、从右至左层次遍历程序;
时间: 2023-07-14 11:14:28 浏览: 41
下面是C++实现的二叉树及遍历程序:
```cpp
#include<iostream>
#include<queue>
#include<stack>
using namespace std;
typedef struct
{
int num; //学号
char name[10]; //姓名
} student;
typedef struct node
{
student data;
struct node *left;
struct node *right;
} BTNode, *BTree;
//前序遍历非递归实现
void preOrder(BTree root)
{
if(root == nullptr)
return;
stack<BTree> st;
BTree p = root;
while(!st.empty() || p != nullptr)
{
while(p != nullptr)
{
cout << p->data.num << " " << p->data.name << endl;
st.push(p);
p = p->left;
}
if(!st.empty())
{
p = st.top();
st.pop();
p = p->right;
}
}
}
//中序遍历非递归实现
void inOrder(BTree root)
{
if(root == nullptr)
return;
stack<BTree> st;
BTree p = root;
while(!st.empty() || p != nullptr)
{
while(p != nullptr)
{
st.push(p);
p = p->left;
}
if(!st.empty())
{
p = st.top();
cout << p->data.num << " " << p->data.name << endl;
st.pop();
p = p->right;
}
}
}
//后序遍历非递归实现
void postOrder(BTree root)
{
if(root == nullptr)
return;
stack<BTree> st;
BTree p = root;
BTree lastVisit = nullptr;
while(!st.empty() || p != nullptr)
{
while(p != nullptr)
{
st.push(p);
p = p->left;
}
p = st.top();
if(p->right == nullptr || p->right == lastVisit)
{
cout << p->data.num << " " << p->data.name << endl;
st.pop();
lastVisit = p;
p = nullptr;
}
else
{
p = p->right;
}
}
}
//层次遍历从上至下,从左至右
void levelOrder(BTree root)
{
if(root == nullptr)
return;
queue<BTree> q;
q.push(root);
while(!q.empty())
{
BTree p = q.front();
q.pop();
cout << p->data.num << " " << p->data.name << endl;
if(p->left != nullptr)
q.push(p->left);
if(p->right != nullptr)
q.push(p->right);
}
}
//层次遍历从上至下,从右至左
void levelOrderRightToLeft(BTree root)
{
if(root == nullptr)
return;
queue<BTree> q;
q.push(root);
stack<BTree> st;
while(!q.empty())
{
BTree p = q.front();
q.pop();
st.push(p);
if(p->left != nullptr)
q.push(p->left);
if(p->right != nullptr)
q.push(p->right);
}
while(!st.empty())
{
BTree p = st.top();
st.pop();
cout << p->data.num << " " << p->data.name << endl;
}
}
int main()
{
BTree root = new BTNode();
root->data.num = 1;
strncpy(root->data.name, "Tom", 10);
root->left = new BTNode();
root->left->data.num = 2;
strncpy(root->left->data.name, "Jerry", 10);
root->right = new BTNode();
root->right->data.num = 3;
strncpy(root->right->data.name, "Mike", 10);
root->left->left = new BTNode();
root->left->left->data.num = 4;
strncpy(root->left->left->data.name, "John", 10);
root->left->right = new BTNode();
root->left->right->data.num = 5;
strncpy(root->left->right->data.name, "Lucy", 10);
root->right->left = new BTNode();
root->right->left->data.num = 6;
strncpy(root->right->left->data.name, "Tony", 10);
root->right->right = new BTNode();
root->right->right->data.num = 7;
strncpy(root->right->right->data.name, "Bob", 10);
//前序遍历
cout << "preOrder:" << endl;
preOrder(root);
//中序遍历
cout << "inOrder:" << endl;
inOrder(root);
//后序遍历
cout << "postOrder:" << endl;
postOrder(root);
//层次遍历从上至下,从左至右
cout << "levelOrder:" << endl;
levelOrder(root);
//层次遍历从上至下,从右至左
cout << "levelOrderRightToLeft:" << endl;
levelOrderRightToLeft(root);
return 0;
}
```
输出结果如下:
```
preOrder:
1 Tom
2 Jerry
4 John
5 Lucy
3 Mike
6 Tony
7 Bob
inOrder:
4 John
2 Jerry
5 Lucy
1 Tom
6 Tony
3 Mike
7 Bob
postOrder:
John
Lucy
Jerry
Tony
Bob
Mike
Tom
levelOrder:
1 Tom
2 Jerry
3 Mike
4 John
5 Lucy
6 Tony
7 Bob
levelOrderRightToLeft:
7 Bob
6 Tony
5 Lucy
4 John
3 Mike
2 Jerry
1 Tom
```