题意:

image.png

解题思路:

  1. 思路:
  2. 1
  3. / \
  4. 2 5
  5. / \ \
  6. 3 4 6
  7. //将 1 的左子树插入到右子树的地方
  8. 1
  9. \
  10. 2 5
  11. / \ \
  12. 3 4 6
  13. //将原来的右子树接到左子树的最右边节点
  14. 1
  15. \
  16. 2
  17. / \
  18. 3 4
  19. \
  20. 5
  21. \
  22. 6
  23. //将 2 的左子树插入到右子树的地方
  24. 1
  25. \
  26. 2
  27. \
  28. 3 4
  29. \
  30. 5
  31. \
  32. 6
  33. //将原来的右子树接到左子树的最右边节点
  34. 1
  35. \
  36. 2
  37. \
  38. 3
  39. \
  40. 4
  41. \
  42. 5
  43. \
  44. 6
  45. 1. 将左子树插入到右子树的地方
  46. 2. 将原来的右子树接到左子树的最右边节点
  47. 3. 考虑新的右子树的根节点,一直重复上边的过程,直到新的右子树为 null

PHP代码实现:

  1. /**
  2. * Definition for a binary tree node.
  3. * class TreeNode {
  4. * public $val = null;
  5. * public $left = null;
  6. * public $right = null;
  7. * function __construct($value) { $this->val = $value; }
  8. * }
  9. */
  10. class Solution {
  11. /**
  12. * @param TreeNode $root
  13. * @return NULL
  14. */
  15. function flatten($root) {
  16. return $this->flattenBystack($root);
  17. if ($root == null) return;
  18. $this->preorder($root, $list);
  19. $cur = $root;
  20. for ($i = 1; $i < count($list); $i++) {
  21. $cur->left = null;
  22. $cur->right = $list[$i];
  23. $cur = $cur->right;
  24. }
  25. }
  26. function flattenBystack($root) {
  27. if ($root == null) return;
  28. $s = new SplStack;
  29. $s->push($root);
  30. $pre = null;
  31. while (!$s->isEmpty()) {
  32. $temp = $s->pop();
  33. if ($pre != null) {
  34. $pre->right = $temp;
  35. $pre->left = null;
  36. }
  37. if ($temp->right != null) $s->push($temp->right);
  38. if ($temp->left != null) $s->push($temp->left);
  39. $pre = $temp;
  40. }
  41. }
  42. function preorder($root, &$list) {
  43. if ($root == null) return;
  44. $list[] = $root;
  45. $this->preorder($root->left, $list);
  46. $this->preorder($root->right, $list);
  47. }
  48. }

GO代码实现:

  1. func flatten(root *TreeNode) {
  2. if root == nil {
  3. return
  4. }
  5. flatten(root.Left)
  6. flatten(root.Right)
  7. r := root.Right
  8. root.Right, root.Left = root.Left, nil
  9. for root.Right != nil {
  10. root = root.Right
  11. }
  12. root.Right = r
  13. }