概述
所謂的反轉二叉樹就是把二叉樹的左子樹變成右子樹,把右子樹變成左子樹。
思路
這個我覺得相對於求二叉樹的高度或者判斷二叉樹是不是完全二叉樹來說,容易很多。其基本思路就是,只要可以遍歷這顆二叉樹就可以實現這個反轉。
代碼
二叉樹構成代碼:

package com.example.demo.tree; import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer; import org.omg.PortableInterceptor.INACTIVE; import java.util.Comparator; /** * @author steve * @date 2020/4/16 10:03 上午 */ public class BinaryTree<E> { private int size; public Node<E> root; private Comparator<E> comparator; public BinaryTree(Comparator<E> comparator){ this.comparator = comparator; } public BinaryTree(){ this(null); } public void add(E element){ if (root == null){ Node node = new Node(element); root = node; }else { Node<E> parent = root; Node<E> node = root; int com = 0; while (node != null){ parent = node; if (comparator == null){ com = ((Comparable)node.element).compareTo(element); }else { System.out.println("-------------"); com = comparator.compare(node.element,element); } if (com > 0){ node = node.left; }else if (com < 0){ node = node.right; }else { node.element = element; return; } } Node<E> newNode = new Node(element); if (com > 0){ parent.left = newNode; newNode.parent = parent.left; }else{ parent.right = newNode; newNode.parent = parent.right; } } size ++; } public boolean isEmpty(){ return size == 0; } public int size(){ return size; } public String toString() { String d = root == null ? null : root.element + ""; if (root == null){ return "root:"+d; }else { String b = root.left == null ? null : root.left.element + ""; String c = root.right == null ? null : root.right.element + ""; return "root:"+d + ", left:" + b + ", right:"+ c; } } public static void main(String[] args) { //這種方式就是匿名內部類,通過給一個類傳一個接口作為參數,然后這個通過一個匿名內部類是實現這個接口來傳入實現。 BinaryTree<Integer> binaryTree = new BinaryTree<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } }); BinaryTree<Integer> binaryTree1 = new BinaryTree<>(); binaryTree1.add(1); binaryTree1.add(2); binaryTree1.add(0); System.out.println(binaryTree1.size()); System.out.println(binaryTree.toString()); } }
節點代碼

package com.example.demo.tree; /** * @author steve * @date 2020/4/18 3:16 下午 */ public class Node<E> { public Node<E> left; public Node<E> right; public Node<E> parent; public E element; public Node(E element){ this.element = element; } }
反轉二叉樹代碼
package com.example.demo.tree; import java.util.LinkedList; import java.util.Queue; /** * @author steve * @date 2020/4/20 9:28 下午 * 反轉二叉樹 */ public class ReverseBinaryTree { /** * 反轉二叉樹 * 這里采用層序遍歷的方式來反轉,其實采用哪一種遍歷方式都可以,但是要通過迭代的方式,不通過遞歸的方式不好實現 * @param node */ public static void reverseBinaryTree(Node<Integer> node){ Queue<Node<Integer>> queue = new LinkedList<>(); queue.add(node); Node<Integer> tempNode = null; while(!queue.isEmpty()){ //這里要注意從隊列中拿出來的其實就是二叉樹中的節點,並不是新生成的節點,所以每次拿出一個節點都把這個節點的左右 //孩子進行反轉,那當一顆二叉樹遍歷完之后所有的節點都會反轉 Node<Integer> node1 = queue.poll(); System.out.println(node1.element); tempNode = node1.left; node1.left = node1.right; node1.right = tempNode; if (node1.left != null){ queue.add(node1.left); } if (node1.right != null){ queue.add(node1.right); } } } public static void main(String[] args) { BinaryTree<Integer> binaryTree = new BinaryTree(); binaryTree.add(7); binaryTree.add(4); binaryTree.add(10); binaryTree.add(9); binaryTree.add(11); binaryTree.add(5); binaryTree.add(3); binaryTree.add(1); binaryTree.add(0); reverseBinaryTree(binaryTree.root); } }