二叉树转换为链表

Posted Yuning算法

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树转换为链表相关的知识,希望对你有一定的参考价值。

上文提到对二叉树递归操作的时候,选择遍历序列的问题,今天做一道难一点的题目,加深一下理解。


A

题目描述

题目的完整描述如下:




B

题目分析


看到题目,首先考虑的是,采用哪种遍历来解决问题。

我们可以从最简单的情况入手,如果是下面这种情况,怎么展开最为简单呢?

二叉树转换为链表

如上图所示,左边是一棵二叉树,按照题目意思转换成右边形式。怎么转换?

我们把这种简单的情况搞定了,后续代码递归调用即可。

对于这种情况,我们先保存右子树,然后让根节点的右孩子指向左孩子,且左孩子置空。经过此过程,情况如下:

二叉树转换为链表 第一步

然后,找到右子树的最后一个结点,假设为rightMost,让其指向right即可。

第二步

这种情况解决完了,剩下的问题递归就可以解决。

但是采用何种遍历?仔细研究上述过程,在第二步的时候,我们需要找到最右孩子结点,也就意味着在当前root结点,它的右孩子其实已经要满足链表的情况了,(注意题目要求,右孩子链接成链表形式)。也就是说,当前root的值是依赖于右孩子结点值的,因此这里采用后序遍历。然后返回结点1,作为上层结点的左孩子或者右孩子。上层在调用的时候,左右孩子都已经转成链表的形式


C

代码分析


    public void flatten(TreeNode root) { if (root == null) { return; }  // 后序遍历调用 flatten(root.left); flatten(root.right);  // 保存右孩子 TreeNode right = root.right; // 让右孩子指向左孩子 root.right = root.left; // 左孩子置空 root.left = null; //找到最后节点,然后让它的右孩子指向根节点的右孩子 findRightMost(root).right = right; }
//找到最右节点 private TreeNode findRightMost(TreeNode root) { if (root == null) { return root; } while(root.right != null) { root = root.right; } return root; }


此题很经典,搞清楚简单的情形以后,判断遍历序列,剩下的递归处理即可。



如果大家觉得写得不错,不妨关注一下,您的认可是给我最大的鼓励。


以上是关于二叉树转换为链表的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode114 二叉树展开为链表 ---二叉树题 三种解法 (递归) (迭代) (前驱节点)

Leetcode 114.二叉树展开为链表

⭐算法入门⭐《二叉树》中等01 —— LeetCode 114. 二叉树展开为链表

LeetCode第114题—二叉树展开为链表—Python实现

LeetCode 114. 二叉树展开为链表(Flatten Binary Tree to Linked List)

二叉树--二叉树展开为链表