二叉树转换为链表
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 二叉树展开为链表 ---二叉树题 三种解法 (递归) (迭代) (前驱节点)
⭐算法入门⭐《二叉树》中等01 —— LeetCode 114. 二叉树展开为链表
LeetCode第114题—二叉树展开为链表—Python实现