【LeetCode & 剑指offer刷题】树题14:36 二叉搜索树与双向链表
【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
36 二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
/*
方法一:中序遍历迭代法
参考题目: Validate Binary Search Tree)
*/
class Solution
{
public:
TreeNode* Convert(TreeNode* root)
{
if(root == nullptr) return nullptr;
TreeNode* head = root;
while(head->left) head = head->left; //二叉搜索树中最左子结点即为中序遍历的第一个结点
stack<TreeNode*> s;
TreeNode* p = root, *pre = nullptr;
while(p || !s.empty())
{
if(p)
{
s.push(p);
p = p->left;
}
else
{
p = s.top();
p->left = pre; //连接p与pre
if(pre) pre->right = p; //连接pre与p
pre = p; //更新pre
s.pop();
p = p->right;
}
}
return head;
}
};
/*
方法二:中序遍历递归法(左、根、右)
*/
class Solution
{
private:
TreeNode* pre;
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == nullptr) return nullptr;
pre = nullptr; //初始化成员变量,用于记录上一次访问的结点
convertNode(pRootOfTree);
TreeNode* head = pRootOfTree;
while(head->left) head = head->left; //二叉搜索树中最左子结点即为中序遍历的第一个结点
return head;
}
private:
void convertNode(TreeNode* cur)
{
if(cur == nullptr) return;
//转换左子树
convertNode(cur->left);
//转换根结点
cur->left = pre;
if(pre) pre->right = cur;
pre = cur; //记录被处理过的结点
//转换右子树
convertNode(cur->right);
}
};
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
/*
中序遍历迭代法
*/