LeetCode_513 找树左下角的值
1、题目:找树左下角的值
给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。
2、解题思路
方法一:递归
递归三步曲
1、确定递归函数的参数和返回值,参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。 这里就不需要返回值了,所以递归函数的返回类型为void。
2、确定终止条件,当遇到叶子节点的时候,就需要统计一下最大的深度了,所以需要遇到叶子节点来更新最大深度。
if (root->left == NULL && root->right == NULL) { if (leftLen > maxLen) { maxLen = leftLen; // 更新最大深度 maxleftValue = root->val; // 最大深度最左面的数值 } return; }
3、确定单层递归的逻辑
if (root->left) { // 左 leftLen++; // 深度加一 traversal(root->left, leftLen); leftLen--; // 回溯,深度减一 } if (root->right) { // 右 leftLen++; // 深度加一 traversal(root->right, leftLen); leftLen--; // 回溯,深度减一 } return;
方法二:迭代(层序遍历)
层序遍历的思想,很简单,在找到最后一行的时候取第一个就好。
3、代码
class Solution { public: int maxLen = INT_MIN; int maxleftValue; void traversal(TreeNode* root, int leftLen) { if (root->left == NULL && root->right == NULL) { if (leftLen > maxLen) { maxLen = leftLen; maxleftValue = root->val; } return; } if (root->left) { leftLen++; traversal(root->left, leftLen); leftLen--; // 回溯 } if (root->right) { leftLen++; traversal(root->right, leftLen); leftLen--; // 回溯 } return; } int findBottomLeftValue(TreeNode* root) { traversal(root, 0); return maxleftValue; } };
class Solution { public: int findBottomLeftValue(TreeNode* root) { queue<TreeNode*> que; if (root != NULL) que.push(root); int result = 0; while (!que.empty()) { 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; } };
上一篇:
IDEA上Java项目控制台中文乱码