image.png

image.png

层次遍历

非递归解法是创建一个栈 首先把root元素放入中,每次出栈,直到全部出栈

  1. package main
  2. import "fmt"
  3. type TreeNode struct {
  4. Val int
  5. Left *TreeNode
  6. Right *TreeNode
  7. }
  8. func invertTree(root *TreeNode) *TreeNode {
  9. if root==nil {// 递归结束条件
  10. return nil
  11. }
  12. right:= invertTree(root.Right)// 返回已经翻转的右节点
  13. left := invertTree(root.Left) // 返回已经翻转的左节点
  14. // 当前需要一级需要做的是把 左节点指向已经翻转的右节点 右节点指向已经翻转的左节点
  15. root.Left = right
  16. root.Right = left
  17. return root
  18. }
  19. func invertTree1(root *TreeNode) *TreeNode {
  20. if root==nil {// 递归结束条件
  21. return nil
  22. }
  23. // 当前需要一级需要做的是把 左节点指向右节点 右节点指向已经翻转的左节点
  24. temp := root.Left
  25. root.Left = root.Right
  26. root.Right = temp
  27. invertTree(root.Left) // 翻转的左节点
  28. invertTree(root.Right)// 返翻转的右节点
  29. return root
  30. }
  31. func invertTree2(root *TreeNode) *TreeNode {
  32. if root==nil {
  33. return nil
  34. }
  35. l := make([]*TreeNode,0)
  36. l = append(l ,root)
  37. for len(l)>0{
  38. curr := l[0]
  39. l = l[1:]
  40. left :=curr.Left
  41. right :=curr.Right
  42. curr.Right = left
  43. curr.Left = right
  44. if curr.Left!=nil {
  45. l = append(l,curr.Left)
  46. }
  47. if curr.Right!=nil {
  48. l = append(l,curr.Right)
  49. }
  50. }
  51. return root
  52. }
  53. func main() {
  54. a := &TreeNode{
  55. Val: 4,
  56. }
  57. b := &TreeNode{
  58. Val: 2,
  59. }
  60. a.Left = b
  61. c := &TreeNode{
  62. Val: 7,
  63. }
  64. a.Right = c
  65. d := &TreeNode{
  66. Val: 1,
  67. }
  68. b.Left = d
  69. e := &TreeNode{
  70. Val: 3,
  71. }
  72. b.Right = e
  73. f := &TreeNode{
  74. Val: 6,
  75. }
  76. c.Left = f
  77. g := &TreeNode{
  78. Val: 9,
  79. }
  80. c.Right = g
  81. // 9 7 64 3 2 1
  82. invertTree2(a)
  83. printOrder(a)
  84. }
  85. func printOrder(root *TreeNode){
  86. if root== nil {
  87. return
  88. }
  89. printOrder(root.Left)
  90. fmt.Println(root.Val)
  91. printOrder(root.Right)
  92. return
  93. }

非递归Java

  1. class Solution {
  2. public TreeNode invertTree(TreeNode root) {
  3. if(root==null) {
  4. return null;
  5. }
  6. //将二叉树中的节点逐层放入队列中,再迭代处理队列中的元素
  7. LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
  8. queue.add(root);
  9. while(!queue.isEmpty()) {
  10. //每次都从队列中拿一个节点,并交换这个节点的左右子树
  11. TreeNode tmp = queue.poll();
  12. TreeNode left = tmp.left;
  13. tmp.left = tmp.right;
  14. tmp.right = left;
  15. //如果当前节点的左子树不为空,则放入队列等待后续处理
  16. if(tmp.left!=null) {
  17. queue.add(tmp.left);
  18. }
  19. //如果当前节点的右子树不为空,则放入队列等待后续处理
  20. if(tmp.right!=null) {
  21. queue.add(tmp.right);
  22. }
  23. }
  24. //返回处理完的根节点
  25. return root;
  26. }
  27. }

参考

https://leetcode-cn.com/problems/invert-binary-tree/solution/dong-hua-yan-shi-liang-chong-shi-xian-226-fan-zhua/