LeetCode-513. Find Bottom Left Tree Value (JAVA)(最左下结点)

513. Find Bottom Left Tree Value

Given a binary tree, find the leftmost value in the last row of the tree.

Example 1:

Input:

    2
   / \
  1   3

Output:
1

Example 2:

Input:

        1
       / \
      2   3
     /   / \
    4   5   6
       /
      7

Output:
7

Note:You may assume the tree (i.e., the given root node)is not NULL.

中规中矩的层次遍历:

BFS

	int ret = 0;
	public int findBottomLeftValue(TreeNode root) {
		if (root == null)
			return ret;
		bfs(root);
		return ret;

	}
	private void bfs(TreeNode root) {
		Queue<TreeNode> q = new LinkedList<>();
		q.add(root);
		// 首先存储第一层的结点值
		ret = root.val;
		// 层次遍历,只需要记录本层结点个数即可
		int curNum = 1;
		// 下一层的节点数
		int nextNum = 0;
		while (!q.isEmpty()) {
			TreeNode node = q.poll();
			curNum--;
			if (node.left != null) {
				q.offer(node.left);
				nextNum++;
			}
			if (node.right != null) {
				q.offer(node.right);
				nextNum++;
			}
			if (curNum == 0) {
				// 当下一层不空的时候,第一个结点就是最左侧结点
				if (!q.isEmpty())
					ret = q.peek().val;
				curNum = nextNum;
				nextNum = 0;
			}
		}
	}
以下来源discuss

改进版BFS

Doing BFS right-to-left means we can simply return the last node's value and don't have to keep track of the first node in the current row or even care about rows at all

从右往左BFS,最后一个结点的值即是结果。

public class Solution {
	public int findBottomLeftValue(TreeNode root) {
		Queue<TreeNode> q = new LinkedList<>();
		q.add(root);
		while (!q.isEmpty()) {
			root = q.poll();
			if (root.right != null)
				q.add(root.right);
			if (root.left != null)
				q.add(root.left);
		}
		return root.val;
	}

}

递归版DFS

We will find the first node in the deepest level, no matter whether it's a left node or right node

public class Solution {
	int ans = 0, pre = 0;

	public int findBottomLeftValue(TreeNode root) {
		findBottomLeftValue(root, 1);
		return ans;
	}

	public void findBottomLeftValue(TreeNode root, int depth) {
		// 如果左或右子树不空,那么pre会比depth小1,
		// 当depth不在增长的时候即是最后一个最左侧结点
		if (pre < depth) {
			ans = root.val;
			pre = depth;
		}
		if (root.left != null)
			findBottomLeftValue(root.left, depth + 1);
		if (root.right != null)
			findBottomLeftValue(root.right, depth + 1);
	}
}
//改进没有全局遍变量的解法
public class Solution {
	public int findBottomLeftValue(TreeNode root) {
		return findBottomLeftValue(root, 1, new int[] { 0, 0 });
	}

	public int findBottomLeftValue(TreeNode root,
			int depth, int[] res) {
		if (res[1] < depth) {
			res[0] = root.val;
			res[1] = depth;
		}
		if (root.left != null)
			findBottomLeftValue(root.left, depth + 1, res);
		if (root.right != null)
			findBottomLeftValue(root.right, depth + 1, res);
		return res[0];
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值