时间限制:1秒 空间限制:32768K 热度指数:340095
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
题目链接:题目链接
这题,emmm,想倒是挺好想的。题目说了是二叉搜索树,而要转换成排序的双向链表。
就是树的中序遍历,遍历出来的结果就是有序的,
即此时按root->left,root,root->right,是有序的,但这是单向链,
所以再把指针指向转换成双向的就ok了。
/*
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 == NULL) return NULL;
TreeNode *pre = NULL;
ConvertTree(pRootOfTree,pre);
TreeNode *res = pRootOfTree;
while(res->left)
{
res = res->left;
}
return res;
}
//传参数时&必须加上
void ConvertTree(TreeNode* tnode,TreeNode*& pre)
{
if(tnode == NULL) return ;
ConvertTree(tnode->left,pre);
tnode->left = pre;
if(pre != NULL) pre->right = tnode;
pre = tnode;
ConvertTree(tnode->right,pre);
}
};
/*
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 == NULL) return NULL;
stack<TreeNode*> stanode;
TreeNode *ptr = pRootOfTree;
TreeNode *pre = NULL;
TreeNode *res = NULL;
bool isfirst = false;
while(ptr != NULL || !stanode.empty()){
while(ptr != NULL){
stanode.push(ptr);
ptr = ptr->left;
}
ptr = stanode.top();
stanode.pop();
if(isfirst){
pre->right = ptr;
ptr->left = pre;
pre = ptr;
}
else{
pre = ptr;
res = ptr;
isfirst = true;
}
ptr = ptr->right;
}
return res;
}
};