链表逆序(递归&非递归)/倒序输出链表值/用一个递增序列构建平衡二叉搜索树/用递归的方法判断数组是不是升(降)序排列

来源:互联网 发布:吹雪霓裳淘宝上多少钱 编辑:程序博客网 时间:2024/05/08 17:20

下面要讨论的问题还是作为自己复习的一个记录吧。

1.首先是链表的逆序,有两种方法可以实现,递归和非递归。

非递归:设置三个指针变量,ppre,pcur,pnext,初始ppre指向NULL,pcur指向头结点,pnext指向pcur的下一个结点。在转化的过程中注意指针的移动和复制。还有到最后注意next指针域的赋值。

递归:似乎也没啥好分析的,还是注意指针的移动和变化。这种问题还是想清楚,写起来会比较顺利,还有就是注意边界条件和最后的节点。

#include<iostream>using namespace std;template <class T>class tNode{public:    T val;    struct tNode *next;    tNode(T x):val(x),next(NULL) {}};tNode<char> *newhead;template <typename T>void createList(T *a,int len,tNode<T> *&head){    head = new tNode<T>(a[0])     ;    tNode<T> *p = head;    for(int i=1;i<len;i++)    {        tNode<T> *tmp = new tNode<T>(a[i]);        p->next = tmp;        p = tmp;    }}template<typename T>void print(tNode<T> *&head){    tNode<T> *p = head;    while(p!=NULL)    {        cout<<p->val<<" ";        p = p->next;                         }    cout<<endl;}template<typename T>tNode<T> * reverse(tNode<T> *&head){    tNode<T> *pcur = head , *ppre = NULL , *pnext = pcur->next;    while(pnext!=NULL)    {        pcur->next = ppre;        ppre = pcur;        pcur = pnext;        pnext = pnext->next;                      }    pcur->next = ppre;//这一句代码是最最最关键的,十分容易忘掉。     return pcur;}template<typename T>void reverse_recursive(tNode<T>* &head,tNode<T> *&cur){     if(cur == NULL)  return;     if(cur->next == NULL)             {         newhead = cur;         return ;     }          tNode<T> *p = cur->next;     reverse_recursive(head,p);          if(cur!=head)     p->next = cur;          else      {         p->next = cur;         cur->next = NULL;          }}int main(){#if 0    tNode<int> *head;    int a[] = {1,2,3,4,5,6,7,8,9};    createList( a,sizeof(a)/sizeof(a[0]),head);    print(head);    //head = reverse(head);    reverse_recursive(head,head);    print(newhead);#endif    #if 1    tNode<char> *head;    char a[] = {'a','b','c','d','e','f','g','h','i'};    createList( a,sizeof(a)/sizeof(a[0]),head);    print(head);    //head = reverse(head);    reverse_recursive(head,head);    print(newhead);#endif        system("pause");    return 0;} 

2.从尾到头打印链表的值。

分析:一般会想到用先把链表逆序,之后遍历之就可以,但是这样的话破坏了原来的链表,有咩有其他的方法?一般遇到倒序,我们想到了两个有十分类似的方法,栈结构和递归方法,当然这两个的实现有着千丝万缕的联系。如果用栈结构的话,那么就先将原循序表遍历的值依次入栈,然后依次弹栈之后得到的序列就是逆序的序列,但是用栈会另外开辟内存空间;那么用递归就不要用多余的内存空间就能解决,下面贴一下递归的代码。

#include<iostream>using namespace std;template <class T>class tNode{public:    T val;    struct tNode *next;    tNode(T x):val(x),next(NULL) {}};tNode<int> *newhead;template <typename T>void createList(T *a,int len,tNode<T> *&head){    head = new tNode<T>(a[0])     ;    tNode<T> *p = head;    for(int i=1;i<len;i++)    {        tNode<T> *tmp = new tNode<T>(a[i]);        p->next = tmp;        p = tmp;    }}<strong>template <typename T>void reverse_print(tNode<T> *&head){    if(head==NULL)         {        return ;                       }    reverse_print(head->next);    cout<<head->val<<" ";}</strong>template<typename T>void print(tNode<T> *&head){    tNode<T> *p = head;    while(p!=NULL)    {        cout<<p->val<<" ";        p = p->next;                         }    cout<<endl;}int main(){    tNode<int> *head;    int a[] = {1,2,3,4,5,6,7,8,9};    createList( a,sizeof(a)/sizeof(a[0]),head);    print(head);    reverse_print(head);    cout<<endl;    system("pause");    return 0;} 

核心的代码就是加黑的部分,很容易理解。


3.用递增序列构建二叉搜索树。

分析:首先我们用二分搜索来生成数组序列,然后将序列中的元素依次插入到树中,构建出来的树一定是平衡二叉搜索树(原因可以从二分搜索的代码中看出)。

#include<iostream>#include<queue> using namespace std;/*定义二叉树的数据结构*/typedef struct BiTNode{    int val;    struct BiTNode *lchild,*rchild;            BiTNode(int x):val(x),lchild(NULL),rchild(NULL) {}}tBiTNode;tBiTNode *pBiTNode;/*创建平衡二叉搜索树,准确来讲应该是将节点插入到平衡二叉搜索树中*/void create_binary_search_tree(tBiTNode *&T,int xx){     if(T==NULL)          {         T = new BiTNode(xx);     }     else     {         if( T->val > xx )         {             create_binary_search_tree(T->lchild,xx);         }         else if( T->val < xx )         {             create_binary_search_tree(T->rchild,xx);         }         else         {             cout<<xx<<" already in the tree"<<endl;         }     }}void binary_search_print(int a[] , int low , int high){     if(low>high)    return ;     int m = ( (high-low)>>1 ) + low;     //cout<<a[m]<<" ";     create_binary_search_tree(pBiTNode,a[m]);     binary_search_print(a,low,m-1) ;     binary_search_print(a,m+1,high);}void PreOrderTraverse(BiTNode *&T){    if(T==NULL)     return;    cout<<T->val<<" ";    PreOrderTraverse(T->lchild);    PreOrderTraverse(T->rchild);}void InOrderTraverse(BiTNode *&T) {    if(T==NULL)      return ;    InOrderTraverse(T->lchild);    cout<<T->val<<" ";    InOrderTraverse(T->rchild);}void PostOrderTraverse(BiTNode *&T){    if(T==NULL)      return ;    PostOrderTraverse(T->lchild);    PostOrderTraverse(T->rchild);    cout<<T->val<<" ";}void LevelTraverse(BiTNode *&T){    if(T==NULL)      return ;    queue<BiTNode *> que;    que.push(T);    while(!que.empty())    {        BiTNode *tmp = que.front();        que.pop();        cout<<tmp->val<<" ";        if(tmp->lchild!=NULL)   que.push(tmp->lchild);        if(tmp->rchild!=NULL)   que.push(tmp->rchild);    }}int main(){    int a[] = {1,2,3,4,5,6,7,8,9} ;    binary_search_print(a,0,sizeof(a)/sizeof(a[0])-1);        cout<<"PreOrderTraverse:"<<endl;    PreOrderTraverse(pBiTNode);    cout<<"\nPostOrderTraverse:"<<endl;    PostOrderTraverse(pBiTNode);    cout<<"\nInOrderTraverse:"<<endl;    InOrderTraverse(pBiTNode);    cout<<"\nLevelTraverse:"<<endl;    LevelTraverse(pBiTNode);    cout<<endl;    system("pause");    return 0;}

结果:



4.用递归的方法判断整数组a[N]是不是升序排列?

#include<iostream>using namespace std;bool isAsc(int a[] , int pos, int len){    if(len == 1) return true;    if(pos==len-2)       {        if(a[pos]<a[pos+1]) return true;        else return false;    }        return (a[pos] <= a[pos+1]) && isAsc(a,pos+1,len);}int main(){    int a[] = {1,2,3,4,5,6,7,8,9} ;    cout<<isAsc(a,0,sizeof(a)/sizeof(a[0]))<<endl;;    system("pause");    return 0;} 



0 0
原创粉丝点击