输入预览:
输出效果:
参考代码:
#include<iostream>
#include<queue>
using namespace std;
struct treenode//二叉树节点
{
int data;
treenode * L;
treenode * R;
};
void create(treenode* &root,int n)//n为节点数目,root必须加引用,否则函数内的一切操作白搭
{
int a,i=0;//a用作输入节点数据,i记录已经加入树中的节点个数(可以不用i,但有时候需要补很多0)
queue<treenode*>q;//用于按层输入数据,库函数,随便搜一搜就知道queue怎么用了
cin >> a;//输入根节点值
if (a == 0)//空树
{
root = NULL;
return;
}
else
{
root = new treenode;//申请根节点
root->data = a;
root->L = NULL;
root->R = NULL;
q.push(root);//入队
i++;
if (i == n)
return;
}
while (!q.empty())
{
treenode* temp = q.front();//一轮循环为root,以后的循环为temp->R或temp->L;
q.pop();//出队
cin >> a;
if (a == 0)
{
temp->L = NULL;
}
else
{
temp->L = new treenode;//一轮循环为将root指针的左孩子指向一个新节点,向新节点赋值刚输入的数据,并将新节点的左右孩子置NULL
temp->L->data = a;
temp->L->L = NULL;
temp->L->R = NULL;
q.push(temp->L);
i++;
if (i == n)
return;
}
cin >> a;
if (a == 0)
{
temp->R = NULL;
}
else
{
temp->R = new treenode;
temp->R->data = a;
temp->R->L = NULL;
temp->R->R = NULL;
q.push(temp->R);
i++;
if (i == n)
return;
}
}
return;
}
void preOrderTraverse(treenode*p)//先序遍历
{
if (p == NULL)
return;
printf_s("%d ", p->data);
preOrderTraverse(p->L);
preOrderTraverse(p->R);
}
void inOrderTraverse(treenode *t)// 中序遍历
{
if (t)
{
inOrderTraverse(t->L);
printf("%d ", t->data);
inOrderTraverse(t->R);
}
}
void postOrderTraverse(treenode *t)// 后序遍历
{
if (t)
{
postOrderTraverse(t->L);
postOrderTraverse(t->R);
printf("%d ", t->data);
}
}
void layerOrderTraverse(treenode *root)//层序遍历
{
queue<treenode*>q;
q.push(root);
while (!q.empty())
{
treenode * now = q.front();
q.pop();
printf("%d ", now->data);
if (now->L != NULL)q.push(now->L);
if (now->R != NULL)q.push(now->R);
}
}
int main()
{
treenode*ro=NULL;
printf_s("请输入节点数:\n");
int n; scanf_s("%d", &n);
printf_s("请按层输入数据:\n");//(左孩子或右孩子缺失补0,每个地方都要补成二叉,最后一个节点例外)
create(ro,n);
printf_s("\n先序遍历:"); preOrderTraverse(ro);
printf_s("\n中序遍历:"); inOrderTraverse(ro);
printf_s("\n后序遍历:"); postOrderTraverse(ro);
printf_s("\n层序遍历:"); layerOrderTraverse(ro);
}
hello world!一起遇见新的世界!