剑指Offer——二叉搜索树与双向链表
2017-10-29 17:12
260 查看
题目描述:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:
二叉搜索树,中序遍历就是排序的。
所以我们利用中序遍历,将前后两个结点连接在一起。
不过为了方便起见,我们可以用中序遍历的逆过程,最后遍历到最小的结点,并连接它,也可以输出为链表的首结点。
我们需要两个指针,记录一前一后的结点。
代码:
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析:
二叉搜索树,中序遍历就是排序的。
所以我们利用中序遍历,将前后两个结点连接在一起。
不过为了方便起见,我们可以用中序遍历的逆过程,最后遍历到最小的结点,并连接它,也可以输出为链表的首结点。
我们需要两个指针,记录一前一后的结点。
代码:
1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 };*/ 10 class Solution { 11 public: 12 TreeNode* Convert(TreeNode* pRootOfTree) { 13 if(pRootOfTree == NULL) return NULL; 14 if(pRootOfTree->left == NULL && pRootOfTree->right == NULL) return pRootOfTree; 15 TreeNode* pHead = NULL; 16 RDL(pRootOfTree, pHead); 17 return pHead; 18 } 19 20 void RDL(TreeNode* pRootOfTree, TreeNode* &pHead) { // 中序遍历的逆过程 21 if(pRootOfTree == NULL) return; 22 if(pRootOfTree->right) { 23 RDL(pRootOfTree->right, pHead); // 右递归 24 } 25 pRootOfTree->right = pHead; // 连接后一个结点 26 if(pHead != NULL) { // 连接前一个结点 27 pHead->left = pRootOfTree; 28 } 29 pHead = pRootOfTree; // pHead前移 30 if(pRootOfTree->left) { 31 RDL(pRootOfTree->left, pHead); // 左递归 32 } 33 } 34 };
相关文章推荐
- 剑指offer--二叉搜索树与双向链表
- 剑指offer-面试题27-二叉搜索树与双向链表
- 剑指offer 4.4 分解简化问题2-二叉搜索树转双向链表
- 【剑指offer】面试题36:二叉搜索树与双向链表
- 【剑指offer:】Q27:二叉搜索树与双向链表
- 剑指Offer面试题27(Java版):二叉搜索树与双向链表
- 【剑指offer】题27:二叉搜索树与双向链表
- 剑指offer解题报告(Java版)——二叉搜索树转换为双向链表 27
- 剑指offer 面试题27—二叉搜索树与双向链表
- 《苦练算法》-剑指Offer- 二十六、二叉搜索树与双向链表 -python编写
- [剑指offer]面试题27 二叉搜索树与双向链表
- 【剑指offer】十八,二叉搜索树与双向链表
- 剑指offer 二叉搜索树与双向链表
- 剑指offer面试题[27]-二叉搜索树与双向链表
- 【剑指Offer学习】【面试题27:二叉搜索树与双向链表】
- 剑指offer--二叉搜索树与双向链表 Java实现
- [剑指offer]二叉搜索树与双向链表
- 剑指offer解题报告(Java版)——二叉搜索树转换为双向链表 27
- 剑指Offer学习总结-二叉搜索树与双向链表
- 剑指offer——二叉搜索树与双向链表