这是我参与更文挑战的第 23 天,活动详情查看: 更文挑战
合并二叉树(617)
题目描述
给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。
你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。
示例 1:
输入:
Tree 1 Tree 2
1 2
/ \ / \
3 2 1 3
/ \ \
5 4 7
输出:
合并后的树:
3
/ \
4 5
/ \ \
5 4 7
复制代码
注意: 合并必须从两个树的根节点开始。
思路分析
合并两个二叉树,也就是说把如果两个二叉树的同一位置的节点都有值,那么就把这两个节点的值相加作为新的二叉树的节点,当二叉树的某个节点为 null,如果另一个棵二叉树的节点有值,同理也是相加,null 的就当做 0 进行处理,如果都为空节点那新的二叉树的这个节点也没有值。
这个问题可以使用递归进行处理,首先 new 一个新的节点,值为旧的两个二叉树的节点和,新的二叉树的左节点的值为旧的两个节点位置的和,右边也是同理。这样大问题可以化为小问题。
代码展示
解法一:
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
TreeNode newNode = null;
if(root1 == null){
return root2;
}
if(root2 == null){
return root1;
}
newNode = new TreeNode(root1.val + root2.val);
newNode.left = mergeTrees(root1.left,root2.left);
newNode.right = mergeTrees(root1.right,root2.right);
return newNode;
}
复制代码
翻转二叉树(226)
题目描述
翻转二叉树
示例 :
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
复制代码
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
复制代码
备注:
这个问题是受到 Max Howell 的 原问题 启发的 :
谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
思路分析
翻转二叉树,这个道题其实比较简单,翻转二叉树,也就是将对应位置的左右节点进行交换,首先我们我们正常交换值的方式进行交换左右节点,然后就是用递归的方式进行处理,递归左子节点的左节点和右节点,大问题化解为小问题,终止条件为该节点为空。
代码展示
解法一:时间复杂度是,空间复杂度是。
public TreeNode invertTree(TreeNode root) {
if(root == null){
return null;
}
TreeNode temp = root.right;
root.right = root.left;
root.left = temp;
invertTree(root.left);
invertTree(root.right);
return root;
}
复制代码
总结
二叉树的合并和二叉树的翻转都可以用递归的方式进行处理,这两个问题属于二叉树中常见的递归使用方式,我们应该牢牢的掌握递归的使用,这样在后面更复杂的问题上才有机会继续突破。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END