0052 二叉搜索树线索化为双向链表
2016-07-28 17:55
429 查看
将一棵二叉搜索树(又叫查找树)转化成一个排序的双向链表,我们也叫它为线索化。
思路:
二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个节点也有两个指针,一个指向前,一个指向后。因此这两种结构有相似之处。在二叉树查找中,左节点的值小于父节点的值,右节点的值大于父节点的值,因此考虑:原先指向左子节点的指针调整为链表指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点指针。
假设二叉树的定义为:
递归的方法线索化代码:
本文来自《剑指offer》.面试题27,仅供参考学习。
思路:
二叉树中,每个节点都有两个指向子节点的指针。在双向链表中,每个节点也有两个指针,一个指向前,一个指向后。因此这两种结构有相似之处。在二叉树查找中,左节点的值小于父节点的值,右节点的值大于父节点的值,因此考虑:原先指向左子节点的指针调整为链表指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点指针。
假设二叉树的定义为:
struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pLeft; };
递归的方法线索化代码:
BinaryTreeNode* Convert(BinaryTreeNode* pRootOfTree) { //pLastNodeInList 指向双向链表的尾节点,我们要返回头结点 BinaryTreeNode* pLastNodeInList = NULL; ConvertNode(pRootOfTree,&pLastNodeInList);//这个函数后面实现 BinaryTreeNode* pHeadOfList = pLastInList; while(pHeadOfList != NULL && pHeadOfList->m_pLeft != NULL) pHeadOfList = pHeadOfList->m_pLeft; return pHeadOfList; //这里定义ConvertNode()函数 void ConvertNode(BinaryTreeNode* pNode, BinaryTreeNode** pLastNodeInList) { if(pNode ==NULL) return ; BinaryTreeNode* pCurrent = pNode; if(pCurrent->m_pLeft != NULL) ConvertNode(pCurrent->m_pLeft,pLastNodeInList); pCurrent->m_pLeft = *pLastNodeInList; if(*pLastNodeInList != NULL) (*pLastNodeInList)->m_pLeft = pCurrent; *pLastNodeInList = pCurrent; if(pCurrent->m_pRight != NULL) ConvertNode(pCurrent->m_pRight,pLastNodeInList); } }
本文来自《剑指offer》.面试题27,仅供参考学习。
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- JS 日期与时间戮相互转化的简单实例
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- asp.net 半角全角转化工具
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- 【数据结构与算法】数组应用4:多项式计算Java版