LeetCode48--左叶子之和、二叉搜索树中的众数

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);
			}
		}
	}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值