前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >114. 二叉树展开为链表 Krains 2020-08-02 08:59:00 树

114. 二叉树展开为链表 Krains 2020-08-02 08:59:00 树

作者头像
Krains
发布2020-08-05 11:35:46
2060
发布2020-08-05 11:35:46
举报
文章被收录于专栏:KrainsKrains

# 题目链接

# 前序遍历

解题思路

  • 二叉树是按照先序遍历展开的,递归时只要记住它先序遍历的之前的一个结点pre,再把当前节点插入到pre的右子树即可
  • 注意要存储root的左右结点信息,因为先序遍历修改了root的左右结点
代码语言:javascript
复制
class Solution {
    TreeNode pre = null;

    public void flatten(TreeNode root) {
        if(root == null)
            return ;
        TreeNode l = root.left;
        TreeNode r = root.right;

        // 左子树清空
        root.left = null;
        // 如果当前root不是根结点,pre就不为null
        if(pre != null){
            pre.right = root;
        }
        // 记录先序遍历的前一个结点
        pre = root;
        
        flatten(l);
        flatten(r);
    }
}

# 后序遍历

解题思路

  • 后续遍历返回的时候我们已经知道root的左右结点信息,这时候我们可以对其展开
  • 对于当前root的左孩子,直接修改为root的右孩子,而对于原来root的右孩子,由于其左子树的结点不止一个,左孩子可能是左子树链表的表头,因此需要将其放在链表的末尾(用测试用例举例说明,当root为1的时,其左孩子是2,2是链表2-3-4的表头,需要将右孩子5放在4的后面)
代码语言:javascript
复制
class Solution {
    public void flatten(TreeNode root) {
        helper(root);
    }

    public TreeNode helper(TreeNode root){
        if(root == null)
            return null;
        TreeNode l = helper(root.left);
        TreeNode r = helper(root.right);
        root.right = l;
        root.left = null;

        // 将右孩子放在root链表的末尾
        TreeNode t = root;
        while(t.right != null){
            t = t.right;
        }
        t.right = r;
        
        return root;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 题目链接
  • # 前序遍历
  • # 后序遍历
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档