题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
比较简单的二叉树题目,我的思路是创造一个辅助队列,中序遍历二叉搜索树,遍历结果即为有序的,将遍历内容填入队列。接着依次弹出,弹出的元素的右指针指向上一个弹出的元素,左指针指向下一个弹出的元素。以下是代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
private:
queue<TreeNode *> Q;
void lianjie(TreeNode* node){
if(node->left) lianjie(node->left);
Q.push(node);
if(node->right) lianjie(node->right);
}
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == NULL) return NULL;
lianjie(pRootOfTree);
TreeNode *res = Q.front(),*curr = Q.front(); Q.pop();
while(!Q.empty()){
TreeNode *tmp = Q.front(); Q.pop();
curr->right = tmp;
tmp->left = curr;
curr = tmp;
}
return res;
}
};
除此之外还有更好的方法,创建一个类成员变量记录上一个遍历的节点。可以从空间和时间两方面都得到优化。
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
private:
TreeNode *pre = NULL;
TreeNode *TreeHead = NULL;
void lianjie(TreeNode* node){
if(node->left) lianjie(node->left);
if(pre == NULL) {
pre = node;
TreeHead = node;
}
else{
node->left = pre;
pre->right = node;
pre = node;
}
if(node->right) lianjie(node->right);
}
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
if(pRootOfTree == NULL) return NULL;
lianjie(pRootOfTree);
return TreeHead;
}
};