题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
- 二叉搜索树的中序遍历是有序的。
- 将二叉搜索树转换为排序的双向链表,则节点左边是小于它的节点,右边反之。
- 在中序遍历的时候,用pre保存上一个节点。
- 假如当前节点为node,按照二叉搜索树中序遍历的特点, 则 p r e → v a l < n o d e → v a l pre\rightarrow val < node\rightarrow val pre→val<node→val, 则 n o d e → l e f t = p r e 则node\rightarrow left = pre 则node→left=pre。如果 p r e pre pre不为空,则可以有 p r e → r i g h t = n o d e pre\rightarrow right = node pre→right=node。
代码
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
private:
TreeNode* pre = nullptr;
public:
TreeNode* Convert( TreeNode* pRootOfTree )
{
if ( !pRootOfTree ) return nullptr;
ConvertNode( pRootOfTree );
TreeNode* resNode = pRootOfTree;
while ( resNode->left ) {
resNode = resNode->left;
}
return resNode;
}
void ConvertNode( TreeNode* node ) {
if ( node == nullptr ) return;
ConvertNode( node->left );
node->left = pre;
if ( pre ) pre->right = node;
pre = node;
ConvertNode( node->right );
return;
}
};