题目描述:
翻转一颗二叉树
示例: 输入: 4 / 2 7 / / 1 3 6 9 输出: 4 / 7 2 / / 9 6 3 1
思路分析:
1)递归,不断交换左右子树,直到子树为空
public static TreeNode invertTree(TreeNode root) { if (root != null) { TreeNode tempNode = invertTree(root.left); root.left = invertTree(root.right); root.right = tempNode; } return root; }
2)迭代:
这个方法的思路就是,我们需要交换树中所有节点的左孩子和右孩子。因此可以创一个队列来存储所有左孩子和右孩子还没有被交换过的节点。开始的时候,只有根节点在这个队列里面。只要这个队列不空,就一直从队列中出队节点,然后互换这个节点的左右孩子节点,接着再把孩子节点入队到队列,对于其中的空节点不需要加入队列。最终队列一定会空,这时候所有节点的孩子节点都被互换过了,直接返回最初的根节点就可以了。
public TreeNode invertTree(TreeNode root) { if (root == null) return null; Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(root); while (!queue.isEmpty()) { TreeNode current = queue.poll(); TreeNode temp = current.left; current.left = current.right; current.right = temp; if (current.left != null) queue.add(current.left); if (current.right != null) queue.add(current.right); } return root; }