题目描述
翻转一棵二叉树。
示例:
输入:
4 / \ 2 7 / \ / \ 1 3 6 9
输出:
4 / \ 7 2 / \ / \ 9 6 3 1
备注:
这个问题是受到 Max Howell 的 原问题 启发的 :
谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
思路
想反转这颗树,起码得会遍历这颗树
下面给出二叉树遍历模板。
模板
递归实现二叉树的前中后序遍历代码非常相似,只用记前序遍历就好。
package 二叉树_前序遍历_递归实现;
public class Solution {
public static void main(String[] args) {
/*
* 5
* / \
* 4 3
* / \
* 1 2
*/
TreeNode root = new TreeNode(5);
root.left = new TreeNode(4);
root.right = new TreeNode(3);
root.left.left = new TreeNode(1);
root.left.right = new TreeNode(2);
new Solution().preOrder(root);
}
// 递归实现
void preOrder(TreeNode root) {
if (root != null) {
System.out.print(root.val + " ");
preOrder(root.left);
preOrder(root.right);
}
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
提交代码
翻转二叉树,遍历过程中交换左右子树就好了。
package 翻转二叉树;
import org.junit.Test;
public class Solution {
@Test
public void testInvertTree() throws Exception {
TreeNode root = new TreeNode(4);
root.left = new TreeNode(2);
root.right = new TreeNode(7);
root.left.left = new TreeNode(1);
root.left.right = new TreeNode(3);
root.right.left = new TreeNode(6);
root.right.right = new TreeNode(9);
invertTree(root);
}
public TreeNode invertTree(TreeNode root) {
if(root!=null){
System.out.println(root.val);
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
invertTree(root.left);
invertTree(root.right);
}
return root;
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
}
分享本
算法竞赛入门经典
https://o8.cn/ztnkDg
密码:rdu3
(本地高速是下载器)