剑指 Offer 36. 二叉搜索树与双向链表
Posted lxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 36. 二叉搜索树与双向链表相关的知识,希望对你有一定的参考价值。
方法一:回溯
解题思路
代码
class Solution
private:
int mx = INT_MIN, mi = INT_MAX;
Node* start = NULL, * end = NULL;
public:
void Lrotate(Node* root, Node* last_root) // 针对左子树,左旋
if (!root || !root->right) return ;
Node* temp = root->right;
while (temp->right) temp = temp->right; // 找当前子树的最大值节点
last_root->left = temp;
temp->right = last_root;
void Rrotate(Node* root, Node* last_root) // 针对右子树,右旋
if (!root || !root->left) return ;
Node* temp = root->left;
while (temp->left) temp = temp->left; // 找当前子树的最小值节点
last_root->right = temp;
temp->left = last_root;
void dfs(Node* root) // 回溯,先递归到底层,然后在回溯的过程中转换为双向链表
if (!root) return ;
if (root->val < mi)
mi = root->val;
start = root;
if (root->val > mx)
mx = root->val;
end = root;
dfs(root->left);
dfs(root->right);
Lrotate(root->left, root);
Rrotate(root->right, root);
if (root->left) root->left->right = root;
if (root->right) root->right->left = root;
Node* treeToDoublyList(Node* root)
dfs(root);
if (!start) return NULL;
start->left = end;
end->right = start;
return start;
;
复杂度分析
时间复杂度:\\(O(n)\\);
空间复杂度:\\(O(n)\\),递归调用栈空间。
方法二:中序遍历
代码
class Solution
private:
Node* pre = NULL, * head = NULL; // 通过一个前指针实现转换过程
public:
void dfs(Node* cur)
if (!cur) return ;
dfs(cur->left);
if (pre != NULL) pre->right = cur;
else head = cur; // 找到最左边节点
cur->left = pre;
pre = cur;
dfs(cur->right);
Node* treeToDoublyList(Node* root)
if (!root) return NULL;
dfs(root);
head->left = pre; // 此时的pre指向最后一个节点
pre->right = head;
return head;
;
剑指offer 27:二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
采用中序遍历遍历二叉树,利用二叉排序树的特性,顺次连接节点,形成双向链表。
C++代码实现
/* 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) { //指向根节点左子树的最后一个节点 TreeNode *pLastNodeInList=NULL; ConvertNode(pRootOfTree ,&pLastNodeInList); TreeNode * pHeadFirst=pLastNodeInList; //记录根节点的值 while(pHeadFirst!=NULL && pHeadFirst->left!=NULL){ pHeadFirst=pHeadFirst->left; } return pHeadFirst; } void ConvertNode(TreeNode* pRootOfTree ,TreeNode** pLastNodeInlist){ if (pRootOfTree ==NULL){ return ; } TreeNode * cur=pRootOfTree; if (cur->left!=NULL){ ConvertNode(cur->left,pLastNodeInlist); } cur->left=*pLastNodeInlist; if(*pLastNodeInlist!=NULL){ (*pLastNodeInlist)->right=cur; } (*pLastNodeInlist)=cur; if (cur->right!=NULL){ ConvertNode(cur->right,pLastNodeInlist); } } };
以上是关于剑指 Offer 36. 二叉搜索树与双向链表的主要内容,如果未能解决你的问题,请参考以下文章