二级指针创建二叉树
//==========================================定义头部
#include <iostream>
using namespace std;
struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;//左右孩子
};
void CreateBiTree(BiTNode**T);//这里必须是二级指针,不可以改成BiTNode**&T
void Inorder(BiTNode* T);//可以改成BiTNode*&T
void PreOrderTraverse(BiTNode* T);//可以改成BiTNode*&T
void Posorder(BiTNode* T);//可以改成BiTNode*&T
//===========================================主函数
int main(){
cout<<"创建一颗树,其中A->Z字符代表树的数据,用“#”表示空树:"<<endl;
BiTNode*T=NULL;//定义T是一级指针
CreateBiTree(&T);//所以,这里必须传递的是T的地址
cout<<"先序递归遍历:"<<endl;
PreOrderTraverse(T);
cout<<endl;
cout<<"中序递归遍历:"<<endl;
Inorder(T);
cout<<endl;
cout<<"后序递归遍历:"<<endl;
Posorder(T);
cout<<endl;
system("pause");
return 1;
}
//=============================================先序递归创建二叉树树
void CreateBiTree(BiTNode** T){
char ch;
if((ch=getchar())=='#') *T=NULL;//注意:是*T=NULL;
else{
(*T)=new BiTNode;//注意
(*T)->data=ch;//注意
CreateBiTree(&(*T)->lchild);//注意
CreateBiTree(&(*T)->rchild);//注意
}
}
//===============================================先序递归遍历二叉树
void PreOrderTraverse(BiTNode* T){
//先序递归遍历二叉树
if(T){//当结点不为空的时候执行
cout<<T->data;
PreOrderTraverse(T->lchild);//
PreOrderTraverse(T->rchild);
}
else cout<<"";
}//PreOrderTraverse
//================================================中序遍历二叉树
void Inorder(BiTNode* T){//中序递归遍历二叉树
if(T){//bt=null退层
Inorder(T->lchild);//中序遍历左子树
cout<<T->data;//访问参数
Inorder(T->rchild);//中序遍历右子树
}
else cout<<"";
}//Inorder
//=================================================后序递归遍历二叉树
void Posorder(BiTNode* T){
if(T){
Posorder(T->lchild);//后序递归遍历左子树
Posorder(T->rchild);//后序递归遍历右子树
cout<<T->data;//访问根结点
}
else cout<<"";
}
//=================================================
一级指针创建二叉树
//==========================================定义头部
#include <iostream>
using namespace std;
struct BiTNode{
char data;
struct BiTNode *lchild, *rchild;//左右孩子
};
void CreateBiTree(BiTNode* &T);
void Inorder(BiTNode* &T);
void PreOrderTraverse(BiTNode* &T);
void Posorder(BiTNode* &T);
//===========================================主函数
int main(){
cout<<"创建一颗树,其中A->Z字符代表树的数据,用“#”表示空树:"<<endl;
BiTNode*T=NULL;//
CreateBiTree(T);//传递的是一级指针T
cout<<"先序递归遍历:"<<endl;
PreOrderTraverse(T);
cout<<endl;
cout<<"中序递归遍历:"<<endl;
Inorder(T);
cout<<endl;
cout<<"后序递归遍历:"<<endl;
Posorder(T);
cout<<endl;
system("pause");
return 1;
}
//=============================================先序递归创建二叉树树
void CreateBiTree(BiTNode* &T){
char ch;
if((ch=getchar())=='#')T=NULL;
else{
T=new BiTNode;//
T->data=ch;//
CreateBiTree(T->lchild);//
CreateBiTree(T->rchild);//
}
}
//===============================================先序递归遍历二叉树
void PreOrderTraverse(BiTNode* &T){
//先序递归遍历二叉树
if(T){//当结点不为空的时候执行
cout<<T->data;
PreOrderTraverse(T->lchild);//
PreOrderTraverse(T->rchild);
}
else cout<<"";
}//PreOrderTraverse
//================================================中序遍历二叉树
void Inorder(BiTNode* &T){//中序递归遍历二叉树
if(T){//bt=null退层
Inorder(T->lchild);//中序遍历左子树
cout<<T->data;//访问参数
Inorder(T->rchild);//中序遍历右子树
}
else cout<<"";
}//Inorder
//=================================================后序递归遍历二叉树
void Posorder(BiTNode* &T){
if(T){
Posorder(T->lchild);//后序递归遍历左子树
Posorder(T->rchild);//后序递归遍历右子树
cout<<T->data;//访问根结点
}
else cout<<"";
}
//=================================================
总结:二者的区别仅仅在于二叉树创建这个函数的差异(分别是void CreateBiTree(BiTNode**T)、void CreateBiTree(BiTNode* &T)),以及主函数调用这个函数时候的差异(分别是CreateBiTree(&T)、CreateBiTree(T));对于遍历,都是一样的。
一级指针必须用引用;
二级指针不能用引用;
对于二级指针:
创建:
void CreateBiTree(BiTNode** T){
char ch;
if((ch=getchar())=='#') *T=NULL;//注意:是*T=NULL;
else{
(*T)=new BiTNode;//注意
(*T)->data=ch;//注意
CreateBiTree(&(*T)->lchild);//注意
CreateBiTree(&(*T)->rchild);//注意
}
}
调用:
BiTNode*T=NULL;
CreateBiTree(&T)
对于一级指针:
创建:
void CreateBiTree(BiTNode* &T){
char ch;
if((ch=getchar())=='#')T=NULL;
else{
T=new BiTNode;//
T->data=ch;//
CreateBiTree(T->lchild);//
CreateBiTree(T->rchild);//
}
}
调用:
BiTNode*T=NULL;
CreateBiTree(T)