题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
一开始有思路,但是在纠结,对于当前节点,要求左子树返回其最大值,而要求右子树返回其最小值,这里用最笨的方法每次判断,并返回。并且还记录的头结点的位置。写的比较麻烦:
/*
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* head;
int min=INT_MAX;
TreeNode* tmp=DFS(pRootOfTree,head,min,0);
return head;
}
TreeNode*& DFS(TreeNode* pRootOfTree,TreeNode* & head,int &min,int signlr){
if(pRootOfTree==NULL)
return pRootOfTree;
if(pRootOfTree->val<min){
min=pRootOfTree->val;
head=pRootOfTree;
}
TreeNode* lnode;
TreeNode* rnode;
lnode=DFS(pRootOfTree->left,head,min,1);
if(lnode!=NULL)
lnode->right=pRootOfTree;
pRootOfTree->left=lnode;
rnode=DFS(pRootOfTree->right,head,min,2);
if(rnode!=NULL)
rnode->left=pRootOfTree;
pRootOfTree->right=rnode;
if(signlr==0||(lnode==NULL&&rnode==NULL))
return pRootOfTree;
else if(signlr==1){
if(rnode!=NULL)
return rnode;
else
return pRootOfTree;
}
else{
if(lnode!=NULL)
return lnode;
else
return pRootOfTree;
}
}
};
借鉴剑指offer的思路,记录链表的最后一个节点,中序遍历就可以实现。
//记录已排好链表的最后一个节点
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree){
if(pRootOfTree==NULL)
return NULL;
TreeNode* lastNodeOfList=NULL;
dfs(pRootOfTree,&lastNodeOfList);
while(lastNodeOfList!=NULL&&lastNodeOfList->left!=NULL)
lastNodeOfList= lastNodeOfList->left;
return lastNodeOfList;
}
void dfs(TreeNode* curNode,TreeNode** lastNodeOfList){
if(curNode==NULL)
return;
//遍历左子树
dfs(curNode->left,lastNodeOfList);
if(*lastNodeOfList!=NULL)
(*lastNodeOfList)->right=curNode;
curNode->left=*lastNodeOfList;
*lastNodeOfList=curNode;
//遍历右子树
dfs((*lastNodeOfList)->right,lastNodeOfList);
}
};