二叉树创建与遍历
先给代码,解析在后面
#include <iostream>
using namespace std;
typedef struct shuju
{
int s;
struct shuju*r;
struct shuju*l;
}sj;
sj*chuang() //二叉树的创建
{
int s;
cin >> s; //输入二叉树本节点的值
if (s == -1) return NULL; //如果输入的值为-1则返回上一节点
sj*root = new sj; //否则开辟节点接受该数据
root->s = s;
root->l = chuang(); //节点之下分左右两个小节点
root->r = chuang();
return root; //返回根节点
}
//前序遍历根,左,右;
void printqian(sj*root)
{
if (root == NULL) return ; //如果根为空,结束
cout << root->s << " "; //把cout<<root->s当作“根,左,右”中的根
printqian(root->l); //把printqian(root->l);当作“根,左,右”中的左
printqian(root->r); //把printqian(root->r);当作“根,左,右”中的右
return ;
}
//中序遍历左,根,右;
void printzhong(sj*root)
{
if (root == NULL) return;
printzhong(root->l);
cout << root->s << " ";
printzhong(root->r);
return;
}
//后序遍历左,右,根;
void printhou(sj*root)
{
if (root == NULL) return;
printhou(root->l);
printhou(root->r);
cout << root->s << " ";
return;
}
int main()
{
int s;
sj*root = chuang(); //调用函数
cout << "前序遍历为:"<< endl;
printqian(root); cout << endl; //调用函数
cout << "中序遍历为:" << endl;
printzhong(root); cout << endl; //调用函数
cout << "后序遍历为:" << endl;
printhou(root); cout << endl; //调用函数
}
图例:
解析:
二叉树的创立是从左往右创立的
首先输入1 作为根节点 ,因为1!= -1,所以开辟空间储存1;
之后到左边的路径输入 2 ,因为2!= -1,所以开辟空间储存2;
再到2为节点的递归中在走左路径输入4,因为4!= -1,所以开辟空间储存4;
再到4为节点的递归中在走左路径输入-1,因为-1==-1,所以返回上一节点4,再走右路径,输入-1,因为-1==-1,所以返回上一节点4,因为4左右输入完了,所以返回4 的上一节点2;再走2 的右路径......