剑指offer:二叉搜索树与双向链表

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向

思路

二叉搜索树的中序序列就是排序的,中序遍历的时候转换下结点left和right指针,用一个pre指针引用记录前一个结点,最开始是nullptr,
然后把剩余部分最小结点left指向它,如果它非空,把它的right指向该结点,结束时它指向最右,然后因为是双向链表,一直找到最左就可以

code


/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:
    void inorder(TreeNode* pRoot,TreeNode*&pre){
        if(pRoot==nullptr)
            return ;
        inorder(pRoot->left,pre);
        pRoot->left=pre;
        if(pre)
            pre->right=pRoot;
        pre=pRoot;
        inorder(pRoot->right,pre);
    }
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if(pRootOfTree==nullptr)
            return nullptr;
        TreeNode* pre=nullptr;
        inorder(pRootOfTree,pre);
        TreeNode* pRoot=pre;
        while(pRoot->left)
            pRoot=pRoot->left;
        return pRoot;
    }
};
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页