剑指offer(27)——二叉搜索树与双向链表
2017-08-10 16:44
239 查看
题目
分析
可以在纸上画出一个二叉搜索树,把它转化为一个双向链表,我们不难发现:在二叉搜索树中,每个节点的指向左孩子的指针让它指向它的前一个节点,指向右孩子的指针让它指向它的后一个节点,经过这样的转换,二叉搜索树就转化成为一个双向链表。思想就是这样,理解思想代码实现也就不难了。还有一点就是,这棵树的根节点总比左孩子大比右孩子小,再转化为为双向链表时对应该节点的前驱总比该节点小,后继总比该节点大。注:该题我只实现非递归版本的解法
代码实现
struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } }; /************************************ 一、非递归版本 1、按照中序遍历的原则将二叉树中的结点压栈,利用栈后进先出的特性先把最小的结点出栈 依次从小到大出栈,然后将每个结点的指向左孩子的指针改为指向前一个结点的指针,将 每个结点的指向右孩子的指针改为指向后一个结点的指针即可 *************************************/ class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree == NULL) return pRootOfTree; //始终指向此刻遍历到的数字中最大的那个数 TreeNode *pMaxInCurList; TreeNode *temp = pRootOfTree; stack<TreeNode *> NodeSt; while(temp || !NodeSt.empty()) { while(temp) { NodeSt.push(temp); temp = temp->left; } temp = NodeSt.top(); NodeSt.pop(); if(pMaxInCurList == NULL) { pMaxInCurList = temp; pRootOfTree = pMaxInCurList; } else { temp->left = pMaxInCurList; pMaxInCurList->right = temp; pMaxInCurList = temp; } temp = temp->right; } return pRootOfTree; } };
相关文章推荐
- 剑指Offer面试题27(Java版):二叉搜索树与双向链表
- 剑指offer面试题[27]-二叉搜索树与双向链表
- 【面试题】剑指Offer-27-将二叉搜索树转换成排序的双向链表
- 【剑指Offer学习】【面试题27:二叉搜索树与双向链表】
- 剑指offer 面试题27 二叉搜索树转换为排序双向链表
- [剑指offer]面试题27 二叉搜索树与双向链表
- 【剑指offer】4.4分解让复杂问题简单化——面试题27:二叉搜索树与双向链表
- 剑指offer 面试题27 二叉搜索树与双向链表
- 剑指offer——面试题27:二叉搜索树与双向链表
- 剑指Offer 27 二叉搜索树与双向链表
- 剑指offer之面试题27:二叉搜索树与双向链表
- 剑指offer 27二叉搜索树与双向链表
- 剑指offer解题报告(Java版)——二叉搜索树转换为双向链表 27
- 剑指offer 面试题27—二叉搜索树与双向链表
- 剑指Offer面试题27(Java版):二叉搜索树与双向链表
- 【剑指Offer学习】【面试题27:二叉搜索树与双向链表】
- 剑指offer解题报告(Java版)——二叉搜索树转换为双向链表 27
- 剑指Offer27:二叉搜索树与双向链表
- 剑指offer-面试题27-二叉搜索树与双向链表
- 剑指Offer-面试题27:二叉搜索树与双向链表