题目要求:将一个二叉树转化成双向链表,但是不能创建任何新的结点,只能通过调整指针来达到目的
解题思路:将二叉树的左子树变成一个双向链表,并将左双向链表的尾节点和根节点双向链接;将右子树的变成双向链表,并将右双向链表的头结点与树根双向链接,最后返回左双向链表的头结点,也就是得到的双向链表的头结点,容易看出这是一个递归,递归的临界条件为叶子结点;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {}
}
//二叉排序树转双向链表,返回头结点,引用保存尾节点
TreeNode* CovertToLink(TreeNode* root,TreeNode* &Tail);
TreeNode* Convert(TreeNode* pRootOfTree)
{
TreeNode* Tail;
return CovertToLink(pRootOfTree,Tail);
}
TreeNode* CovertToLink(TreeNode* root,TreeNode* &Tail)
{
if(root==nullptr)
return nullptr;
if(root->left==nullptr&&root->right==nullptr)
{
Tail=root;
return root;
}
TreeNode* Head=nullptr;
TreeNode* leftTail=nullptr;
TreeNode* rightTail=nullptr;
if(root->left!=nullptr)
{
Head=CovertToLink(root->left,leftTail);
root->left=leftTail;
root->left->right=root;
}
else
{
Head=root;
}
if(root->right!=nullptr)
{
root->right=CovertToLink(root->right,rightTail);
root->right->left=root;
Tail=rightTail;
}
else
{
Tail=root;
}
return Head;
}