- 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
- 思路
- 减而治之,递归操作
- 假设左子树已经变成了一个排好序的双向链表,找到左子树的最后一个节点,与根节点建立双向关系
- 假设右子树已经变成了一个排好序的双向链表,右子树的第一个节点即根节点的下一个节点,与根节点建立双向关系
- 启发或者坑
- 需要明白递归返回的是排好序的双向链表的首节点。所以左子树对于根的前一个节点是最后一个节点,右子树对于根的后一个节点是第一个节点
- 代码
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { if (!pRootOfTree) return NULL; TreeNode* leftTemp = pRootOfTree->left; TreeNode* rightTemp = pRootOfTree->right; TreeNode* head = pRootOfTree; if (leftTemp) { head = Convert(leftTemp); TreeNode* lastLeftTemp= head; while(lastLeftTemp->right) lastLeftTemp = lastLeftTemp->right; pRootOfTree->left = lastLeftTemp; lastLeftTemp->right = pRootOfTree; } if (rightTemp) { TreeNode* righthead = Convert(rightTemp); pRootOfTree->right = righthead; righthead->left = pRootOfTree; } return head; } };
剑指offer 30.二叉搜索树与双向链表
猜你喜欢
转载自blog.csdn.net/Alexia23/article/details/103866229
今日推荐
周排行