pat甲级1064-Complete Binary Search Tree

来源:互联网 发布:淘宝把买家加入黑名单 编辑:程序博客网 时间:2024/06/07 23:50

这个是应用递归算法的一道经典题,由于要构造一棵二叉查找树,首先对所给的节点值按大小排序,根据完全查找二叉树的性质分别确定各个结点的位置即可。C++代码如下:

#include <bits/stdc++.h>using namespace std;struct T{    int data;    T*left;    T*right;    T(int d,T*l=nullptr,T*r=nullptr):data(d),left(l),right(r)    {    }    bool operator <(const T&t)const    {        return this->data<t.data;    }};vector<T>v;T*root=nullptr;int mici(int n){    if(n==0)        return 1;    int k=1;    for(int i=0;i<n;++i)    {        k*=2;    }    return k;}int cengshu(int n){    int i=0;    while(mici(i)<n+1)    {        ++i;    }    return i;}T*createTree(int left,int right,int n){    if(left>right-1)        return nullptr;    if(left==right-1)        return &v[left];    int p=0;    int t=mici(n-2);    int k=right-left-t*2+1;    if(k<=t)    {        p=left+t+k-1;    }    else    {        p=left+t*2-1;    }    v[p].left=createTree(left,p,n-1);    v[p].right=createTree(p+1,right,n-1);    return &v[p];}void LevelOrder(){    if(root==nullptr)        return ;    queue<T*>q;    cout<<root->data;    if(root->left!=nullptr)        q.push(root->left);    if(root->right!=nullptr)        q.push(root->right);    while(!q.empty())    {        T*t=q.front();        q.pop();        cout<<" "<<t->data;        if(t->left!=nullptr)            q.push(t->left);        if(t->right!=nullptr)            q.push(t->right);    }}void PreOrder(T*t){    if(t!=nullptr)    {        cout<<t->data<<" ";        if(t->left!=nullptr)            PreOrder(t->left);        if(t->right!=nullptr)            PreOrder(t->right);    }}int main(){    int n;    cin>>n;    if(n==0)        return 0;    for(int i=0;i<n;++i)    {        int a;        cin>>a;        v.push_back(T(a));    }    sort(v.begin(),v.end());    int ceng=cengshu(n);    root=createTree(0,v.size(),ceng);    LevelOrder();    return 0;}


阅读全文
0 0
原创粉丝点击