题解 | #二叉搜索树与双向链表#

二叉搜索树与双向链表

http://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5

中序遍历+链表操作

思路: 考虑到BST树的左孩子节点小于根节点,右孩子节点大于根节点,因此中序遍历BST树时,节点即可排序;因此在生成双向链表时,总是维护一个尾指针(保存当前遍历的最后一个节点),下次遍历时让当前节点的左指针指向尾节点,让尾节点的右指针指向当前节点即可

class Solution {
public:
    void dfs(TreeNode* pRoot,TreeNode*& pLast){//传pLast指针的应用,保存遍历的最后一个节点
        if(pRoot==nullptr) return ;
        TreeNode* pCurrent=pRoot;
        if(pCurrent->left!=nullptr){//中序遍历
            dfs(pCurrent->left, pLast);
        }
        pCurrent->left=pLast;//双向链表的操作
        if(pLast!=nullptr) pLast->right=pCurrent;
        pLast=pCurrent;
        if(pCurrent->right!=nullptr){
            dfs(pCurrent->right, pLast);
        }
    }
    
    TreeNode* Convert(TreeNode* pRootOfTree) {
        TreeNode* pLast=nullptr;
        dfs(pRootOfTree, pLast);
        TreeNode* head=pLast;
        while(head!=nullptr && head->left!=nullptr)//找到头指针
            head=head->left;
        return head;
    }
};
  • 时间复杂度: 需要遍历完所有节点,因此为O(N)
  • 空间复杂度: 原地操作,无需额外空间,为O(1)
全部评论

相关推荐

码农索隆:这种hr,建议全中国推广
点赞 评论 收藏
分享
05-12 17:00
门头沟学院 Java
king122:你的项目描述至少要分点呀,要实习的话,你的描述可以使用什么技术,实现了什么难点,达成了哪些数字指标,这个数字指标尽量是真实的,这样面试应该会多很多,就这样自己包装一下,包装不好可以找我,我有几个大厂最近做过的实习项目也可以包装一下
点赞 评论 收藏
分享
05-30 12:03
山西大学 C++
offer来了我跪着...:不是骗子,等到测评那一步就知道为啥这么高工资了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务