【从零单排之微软面试100题系列】01之二叉查找树与双向链表
来源:互联网 发布:ubuntu搜狗输入法设置 编辑:程序博客网 时间:2024/04/29 02:18
本题目选自July大神博客系列【微软面试100题】:july大神,该系列我主要用来记录我的学习笔记。
题目描述:把二元查找数转变成排序的双向链表
要求:输入一棵二元查找树,不能创建任何新的节点,只调整指针的指向
分析思路:(本题也见于《剑指offer》的面试题27.)
由于二元查找树左子树全部小于根结点,右子树全部大于根结点,可以采用中序遍历。这样遍历得到的双向链表就是排好序的。
遍历时让每个结点的左指针指向双向链表前一个结点,右指针指向双向链表后一个结点。
考虑这样一种情况:当遍历到根结点时,左子树已经转换成了排序的双向链表,那么根结点就是双向链表的下一个结点,根结点的左指针应该指向双向链表中的最后一个结点。
将根结点与双向链表最后一个结点连接起来,接着继续遍历右子树。
可以用递归思想。
二元树结点定义:
<pre name="code" class="cpp">struct BinaryTreeNode{ int m_data; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};
代码
BinaryTreeNode* Convert(BinaryTreeNode* pRoot){ //pLastNode 指向双向链表尾结点 BinaryTreeNode *pLastNode = NULL; ConvertNode(pRoot, &pLastNode); BinaryTreeNode* pHead = pLastNode;//pHead用来保存双向链表头结点 //从尾结点逆向遍历到头结点,并返回之 while(pHead != NULL && pHead->m_pLeft != NULL) pHead = pHead->m_pLeft; return pHead;}
</pre><p><pre name="code" class="cpp">void ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode** pLastNode){ if(pNode == NULL) return; //如果存在左子树,则对左子树排序,最后将当前结点与排序后的最后一个结点相连接 if(pNode->m_pLeft != NULL) ConvertNode(pNode->m_pLeft, pLastNode); pNode->m_Left = *pLastNode; if(pLastNode != NULL) (*pLastNode)->m_pRight = pNode; //将当前结点设置为双向链表最后一个结点 *pLastNode = pNode; if(pNode->m_pRight != NULL) ConvertNode(pNode->m_pRight, pLastNode);}总结一下上述思路:中序遍历二元查找树,使用一个初始为NULL的pLastNode指针保存双向链表最后一个位置的结点。
当中序遍历到某一结点pNode时,其左子树已经排好序,pLastNode指向的结点的下一个结点就是pNode,所以将二者连接起来,并重置pLastNode使其指向pNode。这样pNode就成为链表里的最后一个结点。
然后再遍历右子树。遍历的过程与之前一样:遍历到右子树最小的结点,将其与pLastNode连接起来,并重置pLastNode,使其成为链表最后一个结点。
考虑递归终止的条件:当遍历到第一个结点(二叉查找树的最小结点)时,该结点不存在左子树,则将pLastNod重置为当前结点,并返回到递归的上一层(其父亲结点或右子树的最小结点),而当前结点成为双向链表里的第一个结点。
0 0
- 【从零单排之微软面试100题系列】01之二叉查找树与双向链表
- 【从零单排之微软面试100题系列】09二叉查找树的后序遍历
- 【从零单排之微软面试100题系列】15之二叉树的镜像
- 【从零单排之微软面试100题系列】16之打印二叉树
- 【从零单排之微软面试100题系列】08之反转链表
- 【从零单排之微软面试100题系列】04之二叉树中和为某一值的路径
- 【从零单排之微软面试100题系列】11之二叉树中结点的最大距离
- 【从零单排之微软面试100题系列】05之查找最小的k个元素
- 【从零单排之微软面试100题系列】07之判断两个链表是否相交
- 【从零单排之微软面试100题系列】13之输出链表倒数第k个结点
- 【从零单排之微软面试100题系列】02之包含 min 函数的栈
- 【从零单排之微软面试100题系列】06之根据上排数写出下排数
- 【从零单排之微软面试100题系列】10之翻转单词顺序
- 【从零单排之微软面试100题系列】18之约瑟夫环问题
- 【从零单排之微软面试100题系列】19之Fibonacci数列
- 【从零单排之微软面试100题系列】20之把字符串转换成整数
- 【从零单排之微软面试100题系列】03之求子数组的最大和
- 【从零单排之微软面试100题系列】12之求1+2+3+…+n
- oracle临时表
- 编译安装 gcc
- NTDS.dit hash提取工具--20150622更新版
- 总结ORACLE和MYSQL的一些区别
- C#注释及说明
- 【从零单排之微软面试100题系列】01之二叉查找树与双向链表
- my.cnf和my.ini配置详解
- 使用excel进行数据挖掘(4)---- 突出显示异常值
- C#设计模式——单例模式(Singleton)
- nyoj473 A^B Problem (快速幂)
- 幼儿信息沟通
- 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage”包
- Java实训最后一天啦
- UIActivityIndicatorView