题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
1 栈循环DFS
/*
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* head = nullptr, *pre = nullptr;
stack<TreeNode*> s;
while(pRootOfTree || !s.empty()) {
while(pRootOfTree) {
s.push(pRootOfTree);
pRootOfTree = pRootOfTree->left;
}
if(!s.empty()) {
pRootOfTree = s.top(); s.pop();
if(pre) {
pre->right = pRootOfTree;
pRootOfTree->left = pre;
} else head = pRootOfTree;
pre = pRootOfTree;
pRootOfTree = pRootOfTree->right;
}
}
return head;
}
};
2 递归大法
//递归大法
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree) {
if (!pRootOfTree) return NULL;
TreeNode *pre = NULL;
convert2List(pRootOfTree, pre);
while (pre->left) pre = pre->left;
return pre;
}
void convert2List(TreeNode* pRoot,TreeNode *&pre) {
if (!pRoot) return;
convert2List(pRoot->left,pre);
pRoot->left = pre;
if (pre) pre->right = pRoot;
pre = pRoot;
convert2List(pRoot->right, pre);
}
};
//再来一个
class Solution {
public:
TreeNode *pre = NULL, *lastLeft = NULL;
TreeNode* Convert(TreeNode* pRootOfTree) {
if(!pRootOfTree) return NULL;
Convert(pRootOfTree->left);
pRootOfTree->left = pre;
if(pre) pre->right = pRootOfTree;
pre = pRootOfTree;
lastLeft = (lastLeft?lastLeft:pRootOfTree);
Convert(pRootOfTree->right);
return lastLeft;
}
};