翻转二叉树、合并二叉树(力扣第226、617题)
题目:
翻转一棵二叉树。
示例:
输入:
4 / \ 2 7 / \ / \ 1 3 6 9
输出:
4 / \ 7 2 / \ / \ 9 6 3 1
分析:
翻转二叉树,核心就是交换左右子树,子树也有子树。这就是逻辑上的重复,所以采用递归的方式解决。
代码:
public TreeNode invertTree(TreeNode root) { if (root == null || (root.left == null && root.right == null)){ return root; } TreeNode left = invertTree(root.left); TreeNode right = invertTree(root.right); root.left = right; root.right = left; return root; }
题目:
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
注意,合并必须从两个树的根节点开始。
示例:
输入: Tree 1 Tree 2 1 2 / \ / \ 3 2 1 3 / \ \ 5 4 7 输出: 合并后的树: 3 / \ 4 5 / \ \ 5 4 7
分析:
因为是合并,所以遍历二叉树的时候必须是对两棵树的同步遍历,即同时访问相同位置的结点。那么就访问的时候就可能出现不同的情况,题目中也说了,如果是节点重叠那么就将两棵树的对应节点值相加作为合并后的新值,否则不为null的节点直接作为新二叉树的节点,那么我们来具体的分析可能的情况,从根节点开始同步访问:
1、两个节点都存在,节点值相加,然后作为新节点的值
2、两个节点都不存在,直接返回null
3、只有一个节点存在,那么就直接返回不为null的节点
合并包括根节点的合并以及左右子树的对应合并,所以用递归的方式可以很好的解决。
代码:
public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if (t1 == null && t2 == null){ return null; } if (t1 == null || t2 == null){ return t1 == null ? t2 : t1; } TreeNode root = new TreeNode(t1.val+t2.val); TreeNode left = mergeTrees(t1.left,t2.left); TreeNode right = mergeTrees(t1.right,t2.right); root.left = left; root.right = right; return root; }