目录
问题描述:
实现代码与解析:
递归:
原理思路:
层序遍历:
原理思路:
问题描述:
给定一个二叉树的 根节点 root
,请找出该二叉树的 最底层 最左边 节点的值。
假设二叉树中至少有一个节点。
示例 1:
输入: root = [2,1,3] 输出: 1
示例 2:
输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7
实现代码与解析:
递归:
class Solution {
public:
int maxDepth=INT_MIN;//记录最大深度,初始化为最小值
int result;//记录结果
void traversal(TreeNode* root,int depth)
{
//判断为叶子结点
if(root->left==NULL&&root->right==NULL)
{
if(depth>maxDepth)
{
result=root->val;//更新结果
maxDepth=depth;//更新最大深度
}
}
if(root->left)
{
traversal(root->left,depth+1);
}
if(root->right)
{
traversal(root->right,depth+1);
}
}
int findBottomLeftValue(TreeNode* root)
{
int depth=0;
traversal(root,depth);
return result;
}
};
原理思路:
此题找树的左下角的值,不是一直向左遍历就行,这里我们要找的是树的最后一层的最左侧的值,不一定是左孩子,也可以是右孩子,只要在最左侧就可以,如下图例子:
所以我们就确定了我们要找的是最大深度的第一个结点,所以我们定义一个maxDepth来记录最大深度,一个depth来记录当前深度,当遇到叶子结点时,我们就开始判断和更新最大深度,同时记录符合条件的结果:
//判断为叶子结点
if(root->left==NULL&&root->right==NULL)
{
if(depth>maxDepth)
{
result=root->val;//更新结果
maxDepth=depth;//更新最大深度
}
}
然后后面的代码就是正常遍历即可,记得在进入下一层时判断一下左子树或右子树是否为空,因为我们没写判断结点为空而返回的代码,所以我们就在移动时,判断一下,不要走到空结点就可以,两种写法都是可以的。
if(root->left)
{
traversal(root->left,depth+1);
}
if(root->right)
{
traversal(root->right,depth+1);
}
或者这样:
//最前面加上这行代码
if(root==NULL) return;
.............//中间省略
.............
.............
traversal(root->left,depth+1);
traversal(root->right,depth+1);
其实这里我们省略了回溯过程:
if (root->left)
{
depth++;
traversal(root->left, depth);
depth--;//回溯
if (root->right)
{
depth++;
traversal(root->right, depth);
depth--; //回溯
}
这样写可能更好理解一些,想明白了后可以写简洁的。这题用层序来写是更简单一点的,下面给出。
层序遍历:
class Solution {
public:
//层序遍历
int findBottomLeftValue(TreeNode* root)
{
if(root==NULL) return 0;
queue<TreeNode*> que;
que.push(root);
int result=root->val;//记录结果
while(!que.empty())
{
int size=que.size();
int flag=0;//判断是否已经记录了每一层第一个结点
for(int i=0;i<size;i++)
{
TreeNode* temp=que.front();
que.pop();
if(temp->left)
{
que.push(temp->left);
if(flag==0)
{
result=temp->left->val;
flag=1;//记录完后,将falg改为1,
}
}
if(temp->right)
{
que.push(temp->right);
if(flag==0)
{
result=temp->right->val;
flag=1;//与上同理
}
}
}
}
return result;
}
};
原理思路:
看到这个题目,首先容易想到的就是层序遍历。记录每层从左到右的第一个结点,为了只记录每层第一个结点避免重复记录,就用falg判断一下就可以,若已经取到了此层的第一个结点,就改变flag的值即可。