递归分析: 递归左子树,递归返回时左子树自然成双向链表,如图,4的左子树将变成1-2-3,当然4的左孩子还是2,

这时只要顺着2向链表的右边找到最后一个结点3将是4在链表中的直接前驱。

右子树操作与左子树对称

alt

class Solution {
public:
    TreeNode *searchDlistLast(TreeNode *p)
    {
        if (!p)
        {
            return NULL;
        }
        
        while (p->right)
        {
            p = p->right;
        }
        
        return p;
    }
    
    TreeNode *searchDlistFirst(TreeNode *p)
    {
        if (!p)
        {
            return NULL;
        }
        
        while (p->left)
        {
            p = p->left;
        }
        
        return p;
    }
    
    void dfs(TreeNode* pRoot)
    {
        if (!pRoot)
        {
            return;
        }

        dfs(pRoot->left);
        TreeNode *prev = searchDlistLast(pRoot->left);
        if (prev)
        {
            prev->right = pRoot;
            pRoot->left = prev;
        }
        
        dfs(pRoot->right);
        TreeNode *next = searchDlistFirst(pRoot->right);
        if (next)
        {
            next->left = pRoot;
            pRoot->right = next;
        }
    }
    
    TreeNode* Convert(TreeNode* pRoot)
    {
        dfs(pRoot);
        return searchDlistFirst(pRoot);
    }
};