题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解析
主要利用中序便利,通过设置一个结点变量记录前一个结点进行变换
需熟练掌握树中序遍历的递归与非递归写法
代码
非递归,主要利用栈
/*
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 *lastnode=nullptr;
TreeNode *p=pRootOfTree;
stack<TreeNode*> s;
while(!s.empty()||p!=nullptr){
while(p!=nullptr){
s.push(p);
p=p->left;
}
if(!s.empty()){
p=s.top();
s.pop();
p->left=lastnode;
if(lastnode)
lastnode->right=p;
lastnode=p;
p=p->right;
}
}
while(pRootOfTree&&pRootOfTree->left)
pRootOfTree=pRootOfTree->left;//找到最左边的头结点
return pRootOfTree;
}
};
递归:
/*
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 *lastnode=nullptr;
TreeNode *p=pRootOfTree;
Convert(p,lastnode);
while(pRootOfTree&&pRootOfTree->left)
pRootOfTree=pRootOfTree->left;
return pRootOfTree;
}
void Convert(TreeNode* root,TreeNode *&lastnode){//注意*&的用法
if(root==nullptr) return;
Convert(root->left,lastnode);
root->left=lastnode;
if(lastnode)
lastnode->right=root;a
lastnode=root;
Convert(root->right,lastnode);
}
};