题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点的指针的指向。
开始没什么思路。但是想到二叉树的所有题目几乎都可以用递归来做。就想到先找根节点。考虑根节点的左边,根节点肯定是连接左子树的最大值点,想到先找根节点的左子树的最大节点。然后找右子树的最小节点,一连起来,再递归,想到就可以实现了。但是写程序的时候发现有点复杂,于是看了书上的代码,书上定义了一个最后的连接节点,直接递归就可以写。代码如下:
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==NULL)
return NULL;
TreeNode* lastNode=NULL;
Convert(pRootOfTree,&lastNode);
TreeNode* newHead=lastNode;
while(newHead!=NULL&&newHead->left!=NULL)
{
newHead=newHead->left;
}
return newHead;
}
void Convert(TreeNode* pRootOfTree,TreeNode** lastNode)
{
TreeNode* curNode=pRootOfTree;
if(curNode==NULL)
return;
if(curNode->left)
Convert(curNode->left,lastNode);
curNode->left=*lastNode;
if(*lastNode!=NULL)
(*lastNode)->right=curNode;
*lastNode=curNode;
if(curNode->right)
Convert(curNode->right,lastNode);
}
};
开始纠结为什么要传递最后节点的地址?而不是直接传送最后节点的指针呢。于是我调试了一下。
考虑树10,6,14,4,8,12,16。如果是直接传送最后节点的指针。当进入了(6,NULL)循环时,此时ConvertNode(4,NULL),在循环中,可以将pLastNode赋予4,但是在跳出循环后,curNode->left=lastNode,此时的lastNode值还是NULL,并不是4,这显然是不对的。因此此处注意要使用最后指针的地址。