题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路
二叉搜索树的特点是按照中序遍历的话,结果就会是一个从小到大排序的数组。
所以使用一个指针指向刚遍历过的节点,另一个指针指向当前节点。
采用递归遍历的方式。
如果当前节点不为空节点,则将当前节点的左节点指向刚遍历过的节点;
如果刚遍历过的节点不为空,则将该节点的右指针指向当前节点。
然后将刚遍历的节点更新为当前节点。
代码实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void ConvertTree(TreeNode* pNode,TreeNode* &pLast){
if(pNode==nullptr){
return ;
}
TreeNode* currNode=pNode;
if(pNode->left){
ConvertTree(currNode->left,pLast);
}
currNode->left=pLast;
if(pLast){
pLast->right=pNode;
}
pLast=currNode;
if(pNode->right){
ConvertTree(currNode->right,pLast);
}
}
TreeNode* Convert(TreeNode* pRootOfTree)
{
TreeNode* pLast=nullptr;
ConvertTree(pRootOfTree,pLast);
TreeNode* headOfList=pLast;
while(headOfList&&headOfList->left){
headOfList=headOfList->left;
}
return headOfList;
}
};