题目:输入一棵二叉搜索树,将该二叉搜素树转换成一个排序的双向链表。
二叉树节点定义以下:ide
struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };
解题思路:
因为经过中序排序能够转化为双向链表,所以,经过中序遍历的方法(左根右)的递归方法能够解决问题,解决完以后,pList节点指向双向链表的尾结点,pList节点须要经过遍历,返回到头节点,一样,咱们也能够经过逆向中序遍历的方法之间完成,代码以下:code
class Solution { public: TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode* pList=nullptr;//双向链表的头节点 Convert(pRootOfTree,pList); return pList; } void Convert(TreeNode* pRootOfTree,TreeNode*& pList) { if(pRootOfTree==nullptr)//递归的出口 return; if(pRootOfTree->right!=nullptr)//递归处理右子树 Convert(pRootOfTree->right,pList); pRootOfTree->right=pList;//right至关于pNext if (pList != nullptr) pList->left = pRootOfTree;//left至关于pPre pList = pRootOfTree;//pList节点从尾结点依次移动到头节点 if (pRootOfTree->left != nullptr)//递归处理左子树 Convert(pRootOfTree->left, pList); } };