617. 合并二叉樹
給定兩個二叉樹,想象當(dāng)你將它們中的一個覆蓋到另一個上時糯彬,兩個二叉樹的一些節(jié)點便會重疊凭语。
你需要將他們合并為一個新的二叉樹。合并的規(guī)則是如果兩個節(jié)點重疊撩扒,那么將他們的值相加作為節(jié)點合并后的新值似扔,否則不為 NULL 的節(jié)點將直接作為新二叉樹的節(jié)點。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/merge-two-binary-trees
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán)炒辉,非商業(yè)轉(zhuǎn)載請注明出處豪墅。o-binary-trees/)
解題思路及方法
從根節(jié)點開始合并,遞歸方法比較簡單黔寇,就是比較左右子樹是否為空的時候比較麻煩但校。
說一點,在調(diào)用遞歸的時候啡氢,要判斷傳入結(jié)點是否為空状囱,不然在調(diào)用時會出現(xiàn)空指針的報錯。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode mergeTrees(TreeNode root1, TreeNode root2) {
if (root1 == null && root2 == null) return null;
TreeNode root = new TreeNode();
// 合并根結(jié)點
if (root1 != null && root2 != null) {
root.val = root1.val + root2.val;
} else {
root.val = root1 == null ? root2.val : root1.val;
}
// 遞歸左右子樹
root.left = mergeTrees(root1 == null ? null : root1.left, root2 == null ? null : root2.left);
root.right = mergeTrees(root1 == null ? null : root1.right, root2 == null ? null : root2.right);
return root;
}
}
結(jié)果如下
404. 左葉子之和
計算給定二叉樹的所有左葉子之和倘是。
示例:
3
/ \
9 20
/ \
15 7
在這個二叉樹中亭枷,有兩個左葉子,分別是 9 和 15搀崭,所以返回 24
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/sum-of-left-leaves
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有叨粘。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處瘤睹。
解題思路及方法
這個就很簡單了升敲,從根節(jié)點開始,判斷是否為左葉子轰传,然后用全局變量記錄和驴党,接著遞歸。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public int sum = 0;
public int sumOfLeftLeaves(TreeNode root) {
if (root == null) return 0;
// 判斷是否左葉子
if (root.left != null && root.left.left == null && root.left.right == null) {
sum += root.left.val;
}
// 遞歸尋找左右子樹的左葉子
sumOfLeftLeaves(root.left);
sumOfLeftLeaves(root.right);
return sum;
}
}
結(jié)果如下
653. 兩數(shù)之和 IV - 輸入 BST
解題思路及方法
跟 1. 兩數(shù)之和這道題的思路一樣获茬,用一個list記錄已經(jīng)出現(xiàn)的節(jié)點的值港庄,然后遞歸,當(dāng)list中存在k-root.val的時候恕曲,說明滿足題意鹏氧,return true,否則return false佩谣。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<Integer> memo = new ArrayList<>();
public boolean findTarget(TreeNode root, int k) {
if (root == null) return false;
if (memo.contains(k - root.val)) {
return true;
} else {
// 備忘錄添加值
memo.add(root.val);
}
return findTarget(root.left, k) || findTarget(root.right, k);
}
}
結(jié)果如下
872. 葉子相似的樹
解題思路及方法
這道題我感覺做麻煩了把还,代碼還可以修改。
單獨寫一個方法用來尋找葉節(jié)點茸俭,用一個全局變量list按先序遍歷的順序記錄下來吊履,然后獲得兩棵樹的葉節(jié)點序列,判斷是否相等瓣履。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
List<Integer> leafList = new ArrayList<>();
public boolean leafSimilar(TreeNode root1, TreeNode root2) {
List<Integer> r1List = findLeaf(root1);
this.leafList = new ArrayList<>();
List<Integer> r2List = findLeaf(root2);
if (r1List.equals(r2List)) return true;
return false;
}
public List<Integer> findLeaf(TreeNode root) {
if (root == null) return null;
// 判斷是否葉結(jié)點
if (root.left == null && root.right == null) {
leafList.add(root.val);
}
// 遞歸左右子樹
findLeaf(root.left);
findLeaf(root.right);
return leafList;
}
}
結(jié)果如下