用链表的形式,根序列号,建立搜索树
/*这里的tree是一个引用,去掉引用符号,main()中的tree仍然是NULL,没有改变tree的值;
有引用&,第一次函数传进来时是NULL,后面传出是tree总是指向头结点8,*/
struct BNode{
int data;
struct BNode* left;
struct BNode* right;
};
int main(){
struct BNode* tree=NULL;
int N,data,cnt3=0;
cin>>N;
int c[N];
for(int i=0;i<N;i++){
cin>>data;
c[i]=data;
Insert(tree,data);
}
}
void Insert(struct BNode* &tree,int data){
static int cnt=0;
if(!tree){
struct BNode* p=(struct BNode*)malloc(sizeof(struct BNode));
p->data=data;
//cout<<"check001:"<<p->data<<endl; 8 6 5 7 10 8 11
p->left=NULL;
p->right=NULL;
tree=p; //tree->left=p;or tree->right=p;
//cout<<"check002:"<<tree->data<<endl; 8 6 5 7 10 8 11
}
else if(data<tree->data){/*cout<<"insert left "<<++cnt<<endl;*/Insert(tree->left, data);}
else if(data>=tree->data){/*cout<<"insert right "<<++cnt<<endl;*/Insert(tree->right, data);}
//cout<<"check003:"<<tree->data<<endl; 测试用,输出的值总为8
}
根据已经建立好的树,进行先序遍历
用递归的方式
int b[100],a[100];;int cnt1=0;int cnt2=0;
void PreorderTraversal(struct BNode* tree){
if(tree){
b[cnt1++]=tree->data;
//cout<<"cnt1++: "<<tree->data<<endl;
PreorderTraversal(tree->left);
PreorderTraversal(tree->right);
}
}
根据已经建立好的树,进行后序遍历
用递归的方式
void PostorderTraversal(struct BNode* tree){
if(tree){
a[cnt2++]=tree->data; //a[]中是根右左
cout<<tree->data<<endl;
PostorderTraversal(tree->right);
PostorderTraversal(tree->left);
}
}
void printPostOder(int N){
cout<<"后序遍历输出:"<<endl; //倒叙输出,左右根,即使后序遍历
for(int i=N-1;i>=0;i--){
cout<<a[i]<<" ";
}
cout<<endl;
}