将二叉搜索树改为双向链表
二叉搜索树与双向链表
http://www.nowcoder.com/questionTerminal/947f6eb80d944a84850b0538bf0ec3a5
代码是仿照着前面的大神写的,主要是想记录下理解这个递归时的思路。
首先,二叉搜索树的排序序列恰好是左-中-右格式的中序遍历,所以可以用中序遍历解决这道题。
而我们知道一般的中序递归结构是:
void inOrder(TreeNode* root) { if(root==NULL) return; inOrder(root->left); //对中序遍历结点的操作 inOrder(root->right); }
所以只要利用这个框架,将注释内的操作理解成“给定一个有序序列,将其以双向链表的形式连接”即可。
而将有序序列以双向链表形式存储很简单,只需要引入一个pre指针即可。
故代码如下:
class Solution { public: TreeNode* pre=nullptr; TreeNode* Convert(TreeNode* root) { if(!root) return root; Convert(root->right); //相当于将一个序列用双向指针连接 if(pre!=nullptr) { root->right=pre; pre->left=root; } pre=root;//记录上一个结点 Convert(root->left); return pre; } };
这里我困惑的一点是,如果我是以“左-中-右”的形式遍历二叉树就不能通过。想了半天,可能是这道题的需求改动过,测试要求返回结点必须是最小结点吧。