题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路:
该结构特点可以类比到双向链表中:
在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点。
所以这两种数据结构的结点是一致,二叉搜索树之所以为二叉搜索树,双向链表之所以为双向链表,只是因为两个指针的指向不同而已,通过改变其指针的指向来实现是完全可能的。
具体实现步骤:
原先指向左子结点的指针调整为链表中指向前一个结点的指针,原先指向右子结点的指针调整为链表中指向下一个结点的指针。
具体转换过程:按照中序遍历的方法遍历二叉搜索树,可以将该二叉树分为三个部分:根节点、左子树和右子树,当遍历结点值为4的节点时,将它分为以2为节点的左子树和以6为节点的右子树,并将4的左指针指向值为3的结点,值为3的节点的右指针指向值为4的结点,因为采用的是中序遍历,所以当遍历到根节点的时候,它的左子树已经遍历结束了,所以要对所有的子树采用递归的执行上述操作
/*
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* pre = NULL;
Tree2list(pRootOfTree,&pre); //运行完之后pre对应最后一个节点
TreeNode* pHead = pre;
while(pHead != NULL && pHead->left != NULL)
pHead = pHead->left;
return pHead;
}
void Tree2list(TreeNode* root,TreeNode** pre){
if(root == NULL)
return;
TreeNode* cur = root;
if(cur->left != NULL)
Tree2list(cur->left,pre);
cur->left = *pre; //当前节点连接前一个节点
if(*pre != NULL) //前一个节点连接当前节点
(*pre)->right = cur;
*pre = cur; //更新当前节点为前一个节点
if(cur->right != NULL)
Tree2list(cur->right,pre);
}
};