剑指offer 面试题27 二叉搜索树与双向链表
来源:互联网 发布:mac pro 必备软件 编辑:程序博客网 时间:2024/06/10 19:51
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
感觉这一题挺难做的,从题二叉搜索树和排序信息,首先,可以得出肯定是要使用树的中序遍历.如果要做成一个双向链表,至少要保存两个指针,它本身还有前一个.但是如果通过递归实现的时候,看下面代码
//先左边 pLast假设是上一个指针 ConvertCore(pCurrent->left,pLast); //第二步:再中间 //cout或转变指针等等.... //再右边 ConvertCore(pCurrent->right,pLast);
上面是中序遍历思路(忽略掉pLast时)…用保存前一个指针的思路,采用递归方法,是有问题的.在第二部中,虽然有前一个指针pLast,但是前一个指针知道的是小的数还是大的数,我们在中间代码部分不好表现出来.假设4 6 8,4 6和6 8组合,对于4,6是右边,对于8,6是左边..
剑指offer书上的思路是这样的.递归就应该要有全局观念,我们只考虑左子树,根结点,和右子树.同时,pLast表示的,不是前一个指针,而是拍好顺序的最后一个指针.这个思路在递归中是统一的.我们拍好左子树,保存了左子树排好后的最后一个结点,然后把当前结点(根结点)与最后一个结点连接,就把左树和根结点连接起来了.同样根据当前结点和右子树第一个结点,同样可以把它们连起来.我们只需要再排好右子树就可以了.
其中还有很重要的细节,pLast应该是指针的指针,因为在递归中,简单的指针是会回值的…要想真正改变,就是要改变指针里面的内容.把它做成指针的指针,我们改变指针里面的那个指针OK了.
代码如下:
TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree==NULL){ return NULL; } TreeNode *pLast=NULL; ConvertCore(pRootOfTree,&pLast); //pLast is last TreeNode *pHead=pLast; while(pHead->left!=NULL){ pHead=pHead->left; } return pHead;}void ConvertCore(TreeNode *pRootofTree,TreeNode **pLast){ if(pRootofTree==NULL){ return ; } TreeNode *pCurrent=pRootofTree; if(pCurrent->left!=NULL){ ConvertCore(pCurrent->left,pLast); } pCurrent->left=*pLast; if(*pLast!=NULL){ //只有一个结点的情况 //如何想到要一个结点情况?? //思路: //要访问left-->指针本身有可能空,不能乱访问-->特殊现象导致指针为空 (*pLast)->right=pCurrent; } *pLast=pCurrent; if(pCurrent->right!=NULL){ ConvertCore(pCurrent->right,pLast); }}
0 0
- [剑指offer][面试题27]二叉搜索树与双向链表
- [剑指offer]面试题27 二叉搜索树与双向链表
- 剑指Offer:面试题27 二叉搜索树与双向链表
- 《剑指Offer》 面试题27:二叉搜索树与双向链表
- 《剑指Offer》学习笔记--面试题27:二叉搜索树与双向链表
- 剑指offer 面试题27—二叉搜索树与双向链表
- 剑指offer--面试题27:二叉搜索树与双向链表--Java实现
- 【剑指Offer学习】【面试题27:二叉搜索树与双向链表】
- 剑指Offer面试题27(Java版):二叉搜索树与双向链表
- 剑指offer之面试题27:二叉搜索树与双向链表
- 剑指offer之面试题27二叉搜索树与双向链表
- 剑指Offer----面试题27:二叉搜索树与双向链表
- 剑指Offer-面试题27:二叉搜索树与双向链表
- 剑指Offer:面试题27——二叉搜索树与双向链表(java实现)
- 剑指offer面试题27:二叉搜索树与双向链表
- 剑指offer--面试题27:二叉搜索树与双向链表
- 剑指Offer面试题27(Java版):二叉搜索树与双向链表
- 剑指offer——面试题27:二叉搜索树与双向链表
- Android学习27
- PAT-A-1002. A+B for Polynomials
- 学习笔记:Android SQLite,并实现SQLite基本CRUD操作的Demo
- Android磨砂图片处理(FastBlur)
- C语言实现顺序存储结构的循环链表
- 剑指offer 面试题27 二叉搜索树与双向链表
- 关于sqlite3数据库文件格式的分析
- 内存管理机制 Thread 1:EXC_BAD_ACCESS(code=EXC_I386_GPFLT)错误
- Ceph实战入门系列(三)——块设备-OpenStack
- Android学习28
- 尚硅谷学习笔记----声明式验证
- UIImage 读取修改像素颜色
- MAD
- 栈的应用-四则运算表达式求值