BST的生成和遍历PAT1043

delete []array; 只是将array所分配内存释放掉, 而并不置array为0, 而是置array一个随机的值,即所谓的野指针. 如果在程序中 你能保证执行完delete 之后不再引用array( 比如在析构函数中),  那么array=0就没有什么必要了。   如果在其它函数中执行的delete []array, 那么这个时候执行array=0; 就很有必要了。
#include<string>
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
typedef struct Node
{
int key;
Node* left;
Node* right;
Node(Node* _l=NULL,Node* _r=NULL,int k=-1):key=k,left=_l,right=_r{};//初始化
}Node;
//C++引用的用法  http://www.cnblogs.com/Mr-xu/archive/2012/08/07/2626973.html
【例1】:int a; int &ra=a; //定义引用ra,它是变量a的引用,即别名
【例2】:void swap(int &p1, int &p2) //此处函数的形参p1, p2都是引用


{ int p; p=p1; p1=p2; p2=p; }   在main中只需要swap(a,b);即可完成交换功能,引用传递相当于传递指针




//BST生成函数(插入节点)
void InsertTree(Node* &tree,int key){
Node **p = &tree;   //二级指针=指针的引用(即为指针的指针)
//采用二级指针传递动态内存
//*ppRoot = NULL;的意思是要将所有结点指针指向NULL,然后返回给主函数,那么二级指针就能达到这个作用,否则
//虽然结点内存释放了,但是所有的结点全部成为野指针,没有固定的指向
while((*p) != NULL){
if(key < (*p)->key)
p = &(*p)->left;
else
p = &(*p)->right;
}
(*p) = new Node;
(*p)->key = key;
}
//释放内存
void ReleaseTree(Node* tree)  
{  
    std::queue<Node*> q;  
    q.push(tree);  
    while(!q.empty())  
    {  
        Node* p = q.front();  
        q.pop();  
        if(p)  
        {  
            q.push(p->left);  
            q.push(p->right);  
            delete p;  
        }  
    }  

//前序遍历BST
void TravelRootLR(Node* tree, std::vector<int>& v)  
{  
    if(tree == NULL) return;  
    v.push_back(tree->key);  
    TravelRootLR(tree->left, v);  
    TravelRootLR(tree->right, v);  
}  
void TravelRootRL(Node* tree, std::vector<int>& v)  
{  
    if(tree == NULL) return;  
    v.push_back(tree->key);  
    TravelRootRL(tree->right, v);  
    TravelRootRL(tree->left, v);  
}  
//后序遍历BST


void TravelLRRoot(Node* tree, std::vector<int>& v)  
{  
    if(tree == NULL) return;  
    TravelLRRoot(tree->left, v);  
    TravelLRRoot(tree->right, v);  
    v.push_back(tree->key);  
}  
void TravelRLRoot(Node* tree, std::vector<int>& v)  
{  
    if(tree == NULL) return;  
    TravelRLRoot(tree->right, v);  
    TravelRLRoot(tree->left, v);  
    v.push_back(tree->key);  
}  
 
int main()  
{  
    int n;  
    while(scanf("%d",&n)!=EOF)  
    {  
        std::vector<int> inputVec(n);  
        for(int i = 0; i < n; ++i)  
            scanf("%d",&inputVec[i]);  
        //build tree  
        Node* tree = NULL;  
        for(int i = 0; i < n; ++i)  
            InsertTree(tree, inputVec[i]);   //生成BST
        //get RootLR & RootRL & RLRoot  
        std::vector<int> t1, t2, t3;  
        TravelRootLR(tree, t1);  
        TravelRootRL(tree, t2);  
          
        //judge  
        //int size = (int)t3.size();  
        //if( IsSame(inputVec, t1) || IsSame(inputVec, t2) )  
        if(inputVec == t1)  //前序非mirror
        {  
            printf("YES\n");  
            TravelLRRoot(tree, t3);  
            int size = (int)t3.size();  
            for(int i = 0; i < size-1; ++i)  
                printf("%d ", t3[i]);  
            printf("%d\n", t3[size-1]);  
        }  
        else if(inputVec == t2)//前序mirror
  
        {  
            printf("YES\n");  
            TravelRLRoot(tree, t3);  
            int size = (int)t3.size();  
            for(int i = 0; i < size-1; ++i)  
                printf("%d ", t3[i]);  
            printf("%d\n", t3[size-1]);  
        }  
        else   
        {  
            printf("NO\n");  
        }  
        ReleaseTree(tree);  
    }  
    return 0;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值