题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。//二叉搜索树转换成双向链表.
//二叉树当前结点的左指针应指向该结点左子树中最右孩子的结点;同时最右孩子的右指针应指向当前结点;
//二叉树当前结点的右指针应指向该结点右子树中最左孩子的结点;同时最左孩子的左指针应指向当前结点;
public TreeNode Convert(TreeNode pRootOfTree) {
if(pRootOfTree==null)
return null;
if(pRootOfTree.left==null&&pRootOfTree.right==null)
return pRootOfTree;
TreeNode head=null;
if(pRootOfTree.left!=null)
{
TreeNode left= Convert(pRootOfTree.left);
TreeNode tmp=left;
while(tmp.right!=null)
tmp=tmp.right;
tmp.right=pRootOfTree;
pRootOfTree.left=tmp;
}
if(pRootOfTree.right!=null)
{
TreeNode right=Convert(pRootOfTree.right);
TreeNode tmp=right;
while(tmp.left!=null)
tmp=tmp.left;
tmp.left=pRootOfTree;
pRootOfTree.right=tmp;
}
//返回链表的头指针
while(pRootOfTree.left!=null)
pRootOfTree=pRootOfTree.left;
return pRootOfTree;
}
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree)
{
//若不存在,直接返回空指针
if(!pRootOfTree)
return nullptr;
//left代表左子树的最左指针,right代表右子树的最右指针
TreeNode *left = nullptr, *right = nullptr;
//若左子树存在,求左子树最左边的指针
if(pRootOfTree->left)
left = Convert(pRootOfTree->left);
//若右子树存在,求右子树的最左边的指针
if(pRootOfTree->right)
right = Convert(pRootOfTree->right);
//先假定最终双向链表的头指针为当前根节点指针
TreeNode *newRoot = pRootOfTree;
//若左子树的最左边指针存在,left就是newRoot,进行链接
if(left)
{
newRoot = left;
while(left->right)
left = left->right;
left->right = pRootOfTree;
pRootOfTree->left = left;
}
//无论右子树最右指针存不存在,都将当前指针指向右子树最右指针
pRootOfTree->right = right;
//若右子树最左的指针存在,则进行链接操作
if(right)
right->left = pRootOfTree;
//返回新双向链表的头节点
return newRoot;
}
};
/*
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 *pre=NULL;
convertHelper(pRootOfTree,pre);
TreeNode * res=pRootOfTree;
while(res->left)
res=res->left;
return res;
}
void convertHelper(TreeNode * cur,TreeNode*& pre) {
if(cur==NULL)return;
convertHelper(cur->left,pre);
cur->left = pre;
if(pre)pre->right=cur;
pre=cur;
convertHelper(cur->right,pre);
}
};