解题思路:
(1)并不是教材上那种巧妙的办法
(2)使用递归,将二叉树的结点地址保存下来,因为需要排序,这里采用中序遍历
(3)在根据排好序的次序,依次为每个结点设置新的前后指针,这里left表示前指针,right表示后指针
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree) {
if(pRootOfTree==NULL) return NULL;
vector<TreeNode*> v;
inorder(v,pRootOfTree);
for(int i=1;i<v.size()-1;i++) {
v[i]->left = v[i-1];
v[i]->right = v[i+1];
}
if(v.size()>=2) {
v[0]->right = v[1];
v[v.size()-1]->left = v[v.size()-2];
}
return v[0];
}
void inorder(vector<TreeNode*> &v,TreeNode* root){
if(root==NULL) return;
inorder(v,root->left);
v.push_back(root);
inorder(v,root->right);
}
};