题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路:
https://www.nowcoder.com/profile/3900945/codeBookDetail?submissionId=16370979
中序遍历即可。只需要记录一个pre指针即可。
这里的TreeNode*& pre要花时间搞清楚:
这里表示:TreeNode* 类型的指针,对于pre这个指针取址后的对象。即一个指向指针的指针。更舒服的写法是
typedef TreeNode* Node;之后就可以定义参数为 Node &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==nullptr) return nullptr;
TreeNode* pre=nullptr;
convertHelper(pRootOfTree,pre);
TreeNode* res=pRootOfTree;
while(res->left)
res=res->left;
return res;
}
void convertHelper(TreeNode* cur,TreeNode*& pre){
if(cur == nullptr) return;
convertHelper(cur->left,pre);
cur->left=pre;
if(pre) pre->right=cur;
pre=cur;
convertHelper(cur->right,pre);
}
};