给定一棵二叉树的根节点root,返回该二叉树最顶层,最左边的值,假定二叉树至少有一个节点。
本题使用迭代法的话,思路很简单,只需要使用层序遍历,并记录每层第一个节点即可,实现方法也很简单,代码如下:
int findBottomLeftValue(TreeNode* root) {
//迭代法--层序遍历
//使用队列来保存每一层的节点
queue<TreeNode*> que;
if(root != nullptr) que.push(root);
int result = 0;
while(!que.empty()){
//size确保每次节点出队列的个数不会错
int size = que.size();
for(int i =0;i<size;i++){
TreeNode* node = que.front();
que.pop();
if(i == 0) result = node->val;
//处理左右子树
if(node->left) que.push(node->left);
if(node->right) que.push(node->right);
}
}
return result;
}
利用层序遍历来处理是最简单的,但我们也可以使用递归法来处理,我们知道,二叉树的最后一行,应该是深度最大的叶子节点所在的一行,因此,我们需要找到深度最大,且在左边的叶子节点,因此,在遍历树的过程中,只要保证先左边后右边即可,这样的话,前、中、后序都是可以实现的
递归三部曲:
确定递归函数的参数和返回值
参数首先要有根节点,然后我们还需要一个变量来记录当前深度,方便和最大深度比较,也需要一个变量来记录最大深度
int maxDepth = INT_MIN;//全局变量,用来记录最大深度
int result;//全局变量,用来记录每一个深度下最左边的值
void traversal(TreeNode* root,int depth)
确定终止条件
在节点为空的时候处理没有意义,因此,当我们遇到叶子节点的时候,就要更新最大深度并保存该深度下最左边的值
if(root->left == nullptr && root->right == nullptr){
if(depth > maxDepth){
maxDepth = depth;
result = root->val;
}
return;
}
确定单层递归逻辑
我们按顺序处理左右子树即可,但是要注意,在处理左右子树时,我们需要回溯
if(root->left){
depth++;//代表我们进入了下一个深度
traversal(root->left,depth);
depth--;//处理完下一个深度后,我们需要回溯到上一个深度层,才可以处理另一边的子树
}
if(root->right){
depth++;
traversal(root->right,depth);
depth--;
}
所以,完整代码如下:
int maxDepth = INT_MIN;
int result;
void traversal(TreeNode* root,int depth){
if(root->left == nullptr && root->right == nullptr){
if(depth > maxDepth){
maxDepth = depth;
result = root->val;
}
}
if(root->left){
depth++;
traversal(root->left,depth);
depth--;//回溯处理
}
if(root->right){
depth++;
traversal(root->right,depth);
depth--;//回溯处理
}
}
我们只需要调用该函数,最后result即为结果