链表逆序(递归&非递归)/倒序输出链表值/用一个递增序列构建平衡二叉搜索树/用递归的方法判断数组是不是升(降)序排列
来源:互联网 发布:吹雪霓裳淘宝上多少钱 编辑:程序博客网 时间: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
- 链表逆序(递归&非递归)/倒序输出链表值/用一个递增序列构建平衡二叉搜索树/用递归的方法判断数组是不是升(降)序排列
- Stack(4)判断数组是不是二叉搜索树的前序遍历(递归及非递归实现)
- 二叉搜索树的后序遍历序列(递归与非递归)
- 树的学习——(递归构建二叉树、递归非递归前序中序后序遍历二叉树、根据前序序列、中序序列构建二叉树)
- 用递归的方法构建二叉树
- 用递归的方法判断一个数组是否为递增数组
- C++用非递归实现二叉树的前序排列,中序排列,后续排列
- 算法导论第十二章-二叉搜索树的插入(递归与非递归),中序输出(递归,用栈,既不用栈也不递归)以及节点的删除
- 用递归判断一个数组是否是递增数组
- 递归构建二叉树---中序遍历二叉树(递归与非递归)
- 构建二叉树(据后序遍历序列)---后续遍历二叉树(递归与非递归)
- 用递归算法判断一个数组是否递增
- 用递归判断一个数组是否递增 JAVA代码
- 用递归算法判断一个数组是否递增
- 判断整型数组a[N]是不是升序排列(递归)
- 遍历二叉树的全部方法(递归+非递归)
- 95 1.判断一字符串是不是对称 2.用递归的方法判断整数组 a[N]是不是升序排列
- 用递归的方法判断整数组a[N]是不是升序排列
- C++设计模式——适配器模式(对象适配器、类适配器)
- C#数据类型总结
- Binary Tree Preorder Traversal
- 深入浅出Android makefile(1)--初探
- unity中查找对象的五种方法
- 链表逆序(递归&非递归)/倒序输出链表值/用一个递增序列构建平衡二叉搜索树/用递归的方法判断数组是不是升(降)序排列
- Android学习之ListView显示XML数据
- 是创业失败还是根本就没有开始?这一年我都干了什么?
- Django 上传文件出现 OSError Permission denied的解决方法
- Ubuntu 12.04 LTS 中文输入法的安装
- UVA - 246 10-20-30 (模拟+STL)
- SQL Server常用内置函数 及 查询示例
- Python学习视频教程大全
- 没有科学家情怀的微软留不住张亚勤