📑 题目:114. 二叉树展开为链表

🚀 本题 LeetCode 传送门

题目大意

给定一个二叉树,原地将它展开为链表。

解题思路

  • 要求把二叉树“打平”,按照先根遍历的顺序,把树的结点都放在右结点中。

  • 按照递归和非递归思路实现即可。

  • 递归的思路可以这么想:倒序遍历一颗树,即是先遍历右孩子,然后遍历左孩子,最后再遍历根节点。

    1. 1
    2. /
    3. 2 5
    4. /
    5. 3 4 6
    6. -----------
    7. pre = 5
    8. cur = 4
    9. 1
    10. /
    11. 2
    12. /
    13. 3 4
    14. 5
    15. 6
    16. -----------
    17. pre = 4
    18. cur = 3
    19. 1
    20. /
    21. 2
    22. /
    23. 3
    24. 4
    25. 5
    26. 6
    27. -----------
    28. cur = 2
    29. pre = 3
    30. 1
    31. /
    32. 2
    33. 3
    34. 4
    35. 5
    36. 6
    37. -----------
    38. cur = 1
    39. pre = 2
    40. 1
    41. 2
    42. 3
    43. 4
    44. 5
    45. 6
  • 可以先仿造先根遍历的代码,写出这个倒序遍历的逻辑:

    1. public void flatten(TreeNode root) {
    2. if (root == null)
    3. return;
    4. flatten(root.right);
    5. flatten(root.left);
    6. }
  • 实现了倒序遍历的逻辑以后,再进行结点之间的拼接:

    1. private TreeNode prev = null;
    2. public void flatten(TreeNode root) {
    3. if (root == null)
    4. return;
    5. flatten(root.right);
    6. flatten(root.left);
    7. root.right = prev;
    8. root.left = null;
    9. prev = root;
    10. }

代码

  1. package leetcode
  2. /**
  3. * Definition for a binary tree node.
  4. * type TreeNode struct {
  5. * Val int
  6. * Left *TreeNode
  7. * Right *TreeNode
  8. * }
  9. */
  10. // 解法一 非递归
  11. func flatten(root *TreeNode) {
  12. list, cur := []int{}, &TreeNode{}
  13. preorder(root, &list)
  14. cur = root
  15. for i := 1; i < len(list); i++ {
  16. cur.Left = nil
  17. cur.Right = &TreeNode{Val: list[i], Left: nil, Right: nil}
  18. cur = cur.Right
  19. }
  20. return
  21. }
  22. // 解法二 递归
  23. func flatten1(root *TreeNode) {
  24. if root == nil || (root.Left == nil && root.Right == nil) {
  25. return
  26. }
  27. flatten(root.Left)
  28. flatten(root.Right)
  29. currRight := root.Right
  30. root.Right = root.Left
  31. root.Left = nil
  32. for root.Right != nil {
  33. root = root.Right
  34. }
  35. root.Right = currRight
  36. }
  37. // 解法三 递归
  38. func flatten2(root *TreeNode) {
  39. if root == nil {
  40. return
  41. }
  42. flatten(root.Right)
  43. if root.Left == nil {
  44. return
  45. }
  46. flatten(root.Left)
  47. p := root.Left
  48. for p.Right != nil {
  49. p = p.Right
  50. }
  51. p.Right = root.Right
  52. root.Right = root.Left
  53. root.Left = nil
  54. }