思路:
1.创建一个新数组
2.中序遍历二叉树 将值放入数组里面
3.遍历数组将值放入双向链表中 建立双向关系
//链表题目已经给出,这里是为了给予展示
//创建一个链表
// struct TreeNode
// {
// int val;
// struct TreeNode*left;
// struct TreeNode*right;
// TreeNode(int x)
// {
// val=x;
// left=NULL;
// right=NULL;
// }
// };
class Solution {
public:
//创建一个数组
vector<TreeNode*>st;
void Inorder(TreeNode*root)
{
if(!root) return;
Inorder(root->left);
st.push_back(root);
Inorder(root->right);
}
TreeNode* Convert(TreeNode* pRootOfTree) {
//中序遍历二叉树然后放入数组里面,然后遍历数组放入双向链表中
if(!pRootOfTree) return pRootOfTree;
Inorder(pRootOfTree);//中序遍历
//根据数组中的顺序将结点连接,注意i的范围
for(int i=0;i<st.size()-1;i++)
{
st[i]->right=st[i+1];//连接关系
st[i+1]->left=st[i];//连接关系
}
return st[0];
}
};
时间复杂度:O(N),等于中序遍历的时间复杂度。
空间复杂度:O(N),开辟了一个数组来存储结点。
解法二:
在树上动手脚,创建一个头指针,一个头指针的前一个指针
遍历左树,找到最左边的是树中最小的数,然后就是链表的头
遍历右树,找到最右边的是树中最大的数,然后就是链表的尾
然后依靠pre指针串联起来,最后输出链表头
class Solution {
public:
//返回的第一个指针,初值为最小值,为NUNLL
TreeNode*head=NULL;
//中序遍历当前值的上一位,初值为最小值,为NULL
TreeNode*pre=NULL;
TreeNode* Convert(TreeNode* pRootOfTree) {
if(pRootOfTree==NULL)
{
//中序递归
return NULL;
}
Convert(pRootOfTree->left);
//找到左树最左最小值
if(pre==NULL)
{
head=pRootOfTree;
pre=pRootOfTree;
}
else
{
pre->right=pRootOfTree;
pRootOfTree->left=pre;
pre=pRootOfTree;//pre等于新的root值
}
//遍历右树
Convert(pRootOfTree->right);
return head;
}
};
时间复杂度:O(N),等于中序遍历的时间复杂度。
空间复杂度:O(N),开辟了一个数组来存储结点。
如有错误,多多指教!