将二叉搜索树改为双向链表

二叉搜索树与双向链表

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;
    }
};

这里我困惑的一点是,如果我是以“左-中-右”的形式遍历二叉树就不能通过。想了半天,可能是这道题的需求改动过,测试要求返回结点必须是最小结点吧。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务