/*由于创建二叉树时采用递归方式创建,所以不需要像链表那样进行头指针的更替,可以直接传入root方便观察*/
#include<iostream>
#include<cstdlib>
#include<queue>
using namespace std;
struct node
{
int data;
node *Ltree;
node *Rtree;
};
//node(int x):valux(x),Ltree(nullptr),Rtree(nullptr){};结构体的函数参数初始化列表 ,默认列表解决了二叉树叶子节点后续节点为空的问题
//在c++11中,不要在声明的时候将结构体内部数据初始化
int CreateBinTree(node* &T)//采用指针引用方便更替传入指针的地址,方便new在堆中重新分配地址 (采用根左右的方法创建二叉树)
{
int size;
cin>>size;
if(size==0) {T=NULL;}
else
{
T= new node;//默认的无参数结构体初始化
T->data=size;
CreateBinTree(T->Ltree);
CreateBinTree(T->Rtree);
}
return 0;
}
void PreOrderTraverse(const node* T)//前序遍历 ,const和值传递,可以有效避免更改 已有的二叉树数据
{
if(T!=NULL)
{
cout<<T->data<<" ";
PreOrderTraverse(T->Ltree);
PreOrderTraverse(T->Rtree);
}
}
void InOrderTraverse(const node* T)//中序遍历
{
if(T!=NULL)
{
InOrderTraverse(T->Ltree);
cout<<T->data<<" ";
InOrderTraverse(T->Rtree);
}
}
void PostOrderTraverse(const node* T)//后序遍历
{
if(T!=NULL)
{
PostOrderTraverse(T->Ltree);
PostOrderTraverse(T->Rtree);
cout<<T->data<<" ";
}
}
void LevelOrderTraverse(node* T)//层次遍历(通过队列实现) 广度优先遍历二叉树
{
queue<node*>mystack;
if(T!=NULL)
mystack.push(T);
while(!mystack.empty())
{
if((mystack.front())->Ltree!=NULL)
{
mystack.push((mystack.front())->Ltree);
}
if((mystack.front())->Rtree!=NULL)
{
mystack.push((mystack.front())->Rtree);
}
cout<<(mystack.front())->data<<" ";
mystack.pop();
}
}
int main()
{
node *T;
CreateBinTree(T);
PreOrderTraverse(T);
cout<<endl;
InOrderTraverse(T);
cout<<endl;
PostOrderTraverse(T);
cout<<endl;
LevelOrderTraverse(T);
return 0;
}
二叉树数据插入,可以当做另一种创建二叉树方法
//二叉树数据的插入,测试
#include<iostream>
#include<cstdlib>
using namespace std;
struct node
{
int data;
node *Ltree;
node *Rtree;
};
/*该方法控制插入的左子节点数据始终小于根节点数据,指针传参时可以更改指针所指向的地址的数据,但不可以更改指针所指向的地址,值传递中指针传递是地址的复制*/
int CreateBinTree(node* &T,int inputData)
{
node *mark;
mark=T;
if(inputData==0)
{
return 0;
}
else
{
while(mark->Ltree!=NULL||mark->Rtree!=NULL)//删选恰当的叶子节点做标记,方便下一步插入做准备
{
if(inputData<mark->data&&inputData<mark->Rtree->data)
{
mark=mark->Ltree;
}
else if(inputData>mark->data&&inputData>mark->Ltree->data)
{
mark=mark->Rtree;
}
else
{
cout<<"该数据重复,请重新输入";
return 0;
}
}
//进行数据插入
if(inputData<mark->data)
{
mark->Ltree=new node;
mark->Ltree->data=inputData;
mark->Ltree->Ltree=NULL;
mark->Ltree->Rtree=NULL;
}
else if(inputData>mark->data)
{
mark->Rtree=new node;
mark->Rtree->data=inputData;
mark->Rtree->Ltree=NULL;
mark->Rtree->Rtree=NULL;
}
else
{
cout<<"数据重复" ;
}
}
return 0;
}
void InOrderTraverse(const node* T)//中序遍历
{
if(T!=NULL)
{
InOrderTraverse(T->Ltree);
cout<<T->data<<" ";
InOrderTraverse(T->Rtree);
}
}
int main()
{
node *root;
int m;
root=new node;
root->data=50;//中间判定值,可申明为常量,
root->Ltree=NULL;
root->Rtree=NULL;
cin>>m;
CreateBinTree(root,m);
InOrderTraverse(root);
return 0;
}