地址:
力扣
https://leetcode-cn.com/problems/LwUNpT/
题目:
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:

输入: root = [2,1,3] 输出: 1
示例 2:

输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7
提示:
- 二叉树的节点个数的范围是
[1,104]-2^31 <= Node.val <= 2^31 - 1
思路:
看起来很简单的一道题,结果来就把意思弄错了,示例并不完整,所以埋了坑
考虑层序遍历,本来用 序号的方式来做,结果发现给定节点数量 10000,太大了,
还是借鉴 654. 最大二叉树 实现的层序遍历来做
以为是找最左子节点,所以有了下面的代码,以后如果题目是找这个,那我可以直接拿来用了
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct {
struct TreeNode *node;
struct TreeNode *next;
int isleft;
}QUEUE_NODE;
void createQueueNode(QUEUE_NODE **qnode, struct TreeNode *node, int isleft)
{
*qnode = (QUEUE_NODE *)malloc(sizeof(QUEUE_NODE));
(*qnode)->node = node;
(*qnode)->next = NULL;
(*qnode)->isleft = isleft;
}
int findBottomLeftValue(struct TreeNode* root){
QUEUE_NODE *pop, *push;
int leftVal = root->val;
// enqueue
createQueueNode(&pop, root, 0);
push = pop;
while(pop != NULL)
{
if(pop->node->left == NULL && pop->node->right == NULL && pop->isleft == 1)
leftVal = pop->node->val;
// enqueue left child
if(pop->node->left != NULL)
{
createQueueNode(&push->next, pop->node->left, 1);
push = push->next;
}
// enqueue right child
if(pop->node->right != NULL)
{
createQueueNode(&push->next, pop->node->right, 0);
push = push->next;
}
// dequeue
pop = pop->next;
}
return leftVal;
}
结果发现是找 最底层最左边的,那么考虑把树的深度带进来
于是正确代码就是
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct {
struct TreeNode *node;
struct TreeNode *next;
int deep;
}QUEUE_NODE;
void createQueueNode(QUEUE_NODE **qnode, struct TreeNode *node, int deep)
{
*qnode = (QUEUE_NODE *)malloc(sizeof(QUEUE_NODE));
(*qnode)->node = node;
(*qnode)->next = NULL;
(*qnode)->deep = deep;
}
int findBottomLeftValue(struct TreeNode* root){
QUEUE_NODE *pop, *push;
int deep = 1;
int leftVal = root->val;
// enqueue
createQueueNode(&pop, root, 1);
push = pop;
while(pop != NULL)
{
if(pop->node->left == NULL && pop->node->right == NULL)
{
if(pop->deep != deep)
{
leftVal = pop->node->val;
deep = pop->deep;
}
}
// enqueue left child
if(pop->node->left != NULL)
{
createQueueNode(&push->next, pop->node->left, pop->deep+1);
push = push->next;
}
// enqueue right child
if(pop->node->right != NULL)
{
createQueueNode(&push->next, pop->node->right, pop->deep+1);
push = push->next;
}
// dequeue
pop = pop->next;
}
return leftVal;
}
本文解析了如何通过层序遍历算法在给定二叉树中找到最底层的最左边节点,包括理解题意误区和关键代码实现过程。适合解决类似LeetCode 654最大二叉树的扩展问题。
1479

被折叠的 条评论
为什么被折叠?



