自顶向下递归法

二叉搜索树与双向链表

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

由于中序遍历二叉树即可将搜索二叉树排序,因此我们只需要将二叉树最左端的结点记作双向列表的头,中序遍历二叉树的同时依次将结点接入双向列表的尾端,并同时更新指向列表的尾端的指针便可。列表的头尾使用类的成员变量来记录。

于是可以分析出递归三部曲:

  1. 递归函数作用:中序遍历二叉树,将当前结点接入双向列表尾端并更新指向尾部的指针,返回头指针
  2. 递归终止条件:当前结点为空时,返回列表的头指针
  3. 下一次递归:按左中右访问结点

由于主函数和递归函数的输入一致,所以可以将递归函数合并入主函数。

class Solution {
    TreeNode* tail = nullptr; //指向列表的头
    TreeNode* head = nullptr; //指向列表的尾

public:
    TreeNode* Convert(TreeNode* pRootOfTree)
    {
        if (!pRootOfTree) //结点为空时终止递归
            return head;
        Convert(pRootOfTree->left); //递归左树
        if (!head) //将树最左端的结点记作列表的头
            head=tail=pRootOfTree;
        else //将结点接入列表的尾并更新尾指针
        {
            pRootOfTree->left=tail;
            tail->right=pRootOfTree;
            tail = pRootOfTree;
        }
        Convert(pRootOfTree->right); //递归右树
        return head; //返回列表的头
    }
};

时间复杂度:O(N) 遍历所有节点一次
空间复杂度:O(N) 当树退化成链表时,递归栈深度为N

全部评论

相关推荐

05-12 11:09
已编辑
门头沟学院 后端
已注销:没必要放这么多专业技能的描述。这些应该是默认已会的,写这么多行感觉在凑内容。项目这块感觉再包装包装吧,换个名字,虽然大家的项目基本都是网上套壳的,但是你这也太明显了。放一个业务项目,再放一个技术项目。技术项目,例如中间件的一些扩展和尝试。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 18:22
投了几百份简历,专业和方向完全对口,都已读不回。尝试改了一下学校,果然有奇效。
steelhead:这不是很正常嘛,BOSS好的是即便是你学院本可能都会和聊几句,牛客上学院本机会很少了
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

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