【问题】输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
【思路】注意此题目是将一个二叉搜索树转换成排序的双向链表,如果没有其他要求,我们可以直接对这个二叉树进行中序遍历,就可以得到已经排序好的节点,然后组合成一个双向链表,但题目不允许转换成新的节点!
尽管如此,仍然可以使用中序遍历的思路,这时我们需要使用一个指针保存前驱节点pre,首先将pre指向当前节点的left,若pre不为空,则修改pre的right指向当前节点,接着让前驱节点向后移动,也就是指向当前节点cur。
/* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution { public: void process(TreeNode* cur, TreeNode*& pre){ if(cur == nullptr) return; process(cur->left, pre); cur->left = pre; if(pre) pre->right = cur; // 如果前驱节点不为空,则将前驱节点的右节点指向当前节点 pre = cur; process(cur->right, pre); } TreeNode* Convert(TreeNode* pRootOfTree) { if(pRootOfTree == nullptr) return nullptr; TreeNode* pre = nullptr; // 声明指针要进行初始化 process(pRootOfTree, pre); TreeNode* res = pRootOfTree; while(res->left){ res = res->left; } return res; } };