1.左叶子之和
//计算给定二叉树的所有左叶子之和。 // // 示例: // // // 3 // / \ // 9 20 // / \ // 15 7 // //在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 // // // Related Topics 树
方法一:深度优先遍历
public int sumOfLeftLeaves(TreeNode root) {
//深度优先遍历
int sum = 0;
if(root == null){
return 0;
}
if(root.left != null && isLeafNode(root.left)){
sum += root.left.val;
}
if(root.left != null && !isLeafNode(root.left)){
sum += sumOfLeftLeaves(root.left);
}
if(root.right != null){
sum += sumOfLeftLeaves(root.right);
}
if(root.left == null && root.right == null){
return 0;
}
return sum;
}
private boolean isLeafNode(TreeNode node) {
return node.left == null && node.right == null;
}
方法二:广度优先遍历
public int sumOfLeftLeaves(TreeNode root) {
//广度优先遍历
if(root == null){
return 0;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
int ans = 0;
while(!queue.isEmpty()){
TreeNode node = queue.poll();
if(node.left != null){
if(isLeafNode(node.left)){
ans += node.left.val;
}else {
queue.offer(node.left);
}
}
if(node.right != null){
if(!isLeafNode(node.right)){
queue.offer(node.right);
}
}
}
return ans;
}
private boolean isLeafNode(TreeNode node) {
return node.left == null && node.right == null;
}
2.二叉搜索树中的众数
//给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。 // // 假定 BST 有如下定义: // // // 结点左子树中所含结点的值小于等于当前结点的值 // 结点右子树中所含结点的值大于等于当前结点的值 // 左子树和右子树都是二叉搜索树 // // // 例如: //给定 BST [1,null,2,2], // // 1 // \ // 2 // / // 2 // // // 返回[2]. // // 提示:如果众数超过1个,不需考虑输出顺序 // // 进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内) // Related Topics 树
采用中序遍历,然后再不断更新最大值的数目
class Solution {
List<Integer> answer = new ArrayList<Integer>();
int base, count, maxCount;
public int[] findMode(TreeNode root) {
dfs(root);
int[] mode = new int[answer.size()];
for (int i = 0; i < answer.size(); ++i) {
mode[i] = answer.get(i);
}
return mode;
}
public void dfs(TreeNode o) {
if (o == null) {
return;
}
dfs(o.left);
update(o.val);
dfs(o.right);
}
public void update(int x) {
if (x == base) {
++count;
} else {
count = 1;
base = x;
}
if (count == maxCount) {
answer.add(base);
}
if (count > maxCount) {
maxCount = count;
answer.clear();
answer.add(base);
}
}
}