题目描述
给定一个二叉树,原地将它展开为一个单链表。
解题思路
1、题意理解:
如上图所示,将一颗二叉树展开为一个单链表,其结点顺序是先序遍历,具体操作如下:
(1)将根节点的左子树放在根节点的右子树的位置
(2)将右子树接在在左子树的最右边结点
(3)对所有结点,一直重复以上步骤,直到没有左子树
2、代码:
(1)其过程是二叉树通过右指针形成一个链表1->2->3->4->5->6
(2)先序遍历的顺序是root, left, right, 如果使用先序遍历,将1的右指针指向2,会将5丢失
(3)后序遍历的顺序是right, left, root, 使用后序遍历,将6的右指针指向5。
代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public void flatten(TreeNode root) {
flatten(root, null);
}
private TreeNode flatten(TreeNode root, TreeNode pre){
if(root == null)
return pre;
pre = flatten(root.right, pre);
pre = flatten(root.left, pre);
root.right = pre;
root.left = null;
pre = root;
return pre;
}
}
参考:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by–26/