根据序列号,建立搜索树 || 递归进行前序和后序遍历

用链表的形式,根序列号,建立搜索树

/*这里的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;
}
发布了65 篇原创文章 · 获赞 0 · 访问量 1300

猜你喜欢

转载自blog.csdn.net/hellobettershero/article/details/104405704