题目
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [0]
输出:[0]
提示:
- 树中结点数在范围 [0, 2000] 内
- -100 <= Node.val <= 100
解题思路
首先带大家回顾一下二叉树的后序遍历
class Node {int val;Node left;Node right;Node(int val) {this.val = val;} }public class BinaryTree {/*** 后序遍历*/public void postorderTraversal(Node root) {if (root != null) {postorderTraversal(root.left);postorderTraversal(root.right);System.out.print(root.val + " ");}} }
首先,定义了一个 Node 类表示二叉树的节点。节点包含了一个整型的 val 值,以及左右两个子节点的引用。
然后,定义了 BinaryTree 类,该类包含了一个方法 postorderTraversal,用于实现后序遍历。
后序遍历的顺序是:先遍历左子树,然后遍历右子树,最后遍历根节点。
如果二叉树为空,则直接返回。否则,先输出左子树的值,然后递归遍历右子树和根节点。
回顾了二叉树的后序遍历后,我们来看一下这道题
1.我们利用递归来解决这个问题,也就是二叉树的遍历思想,在还没操作节点右子树前,不能破坏该节点的右子树指向。所以采用后序遍历。
2.将root的右子树先存在 temp 节点中,然后令root.right = root.left ,不要忘记要将root.left节点置空,之后我们对root节点进行判断若root节点还存在右子树,我们就令 root = root.right ,直到找到最后一个右子树,将temp中保存的之前的右子树接在最后一个右子树的右边即可。
代码实现
class Solution {public void flatten(TreeNode root) {if(root == null){return;}flatten(root.left);flatten(root.right);TreeNode temp = root.right;root.right = root.left;root.left = null;while(root.right != null) root = root.right;root.right = temp;}
}