1. 二叉树不易构建
在leetcode中刷题时,如果没有会员就需要将代码拷贝到本地的编译器进行调试。但是leetcode中有一类题可谓是毒瘤,那就是二叉树的题。
要调试二叉树有关的题需要根据测试用例给出的前序遍历,自己构建一个二叉树,非常不方便。
作为一个懒人,在此之前我的解决办法就是硬看程序,反复检查,但是确实有点折磨了。
前几天在刷二叉树有关的题时心血来潮写了一个函数来帮助构建二叉树。
2. 代码
#include <iostream>
#include <queue>
using namespace std;
#define null -1
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
TreeNode* construct(vector<int>& nums)
{
int n = nums.size();
TreeNode* newnode = nullptr;
queue<TreeNode*> q;
if (n != 0)
{
int i = 0;
newnode = new TreeNode(nums[i++]);
q.push(newnode);
while (!q.empty())
{
if (i < n && nums[i] != null)
{
q.front()->left = new TreeNode(nums[i]);
q.push(q.front()->left);
}
i++;
if (i < n && nums[i] != null)
{
q.front()->right = new TreeNode(nums[i]);
q.push(q.front()->right);
}
i++;
q.pop();
}
}
return newnode;
}
leetcode给出的前序遍历中,空结点通常用null来表示,在程序中我们可以用一个数据范围之外的数来表示空结点,并将null定义为这个数。上面的代码中用的是-1。
我们用这个函数来帮助我们调试上面的这道题:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
#define null -1
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
class Solution {
public:
TreeNode* ans;
int count, ansCount;
int dfs(TreeNode* root)
{
if (root == nullptr) return 0;
count++;
int left = dfs(root->left);
int right = dfs(root->right);
count--;
if (left == right && count + left >= ansCount)
{
ans = root;
ansCount = count + left;
}
return max(left, right) + 1;
}
TreeNode* lcaDeepestLeaves(TreeNode* root) {
ans = nullptr;
count = ansCount = 0;
dfs(root);
return ans;
}
};
TreeNode* construct(vector<int>& nums)
{
int n = nums.size();
TreeNode* newnode = nullptr;
queue<TreeNode*> q;
if (n != 0)
{
int i = 0;
newnode = new TreeNode(nums[i++]);
q.push(newnode);
while (!q.empty())
{
if (i < n && nums[i] != null)
{
q.front()->left = new TreeNode(nums[i]);
q.push(q.front()->left);
}
i++;
if (i < n && nums[i] != null)
{
q.front()->right = new TreeNode(nums[i]);
q.push(q.front()->right);
}
i++;
q.pop();
}
}
return newnode;
}
int main()
{
vector<int> nums = { 3,5,1,6,2,0,8,null,null,7,4 };
cout << Solution().lcaDeepestLeaves(construct(nums))->val << endl;
}
这下就方便多了。
如果函数的返回值是 TreeNode* 的话,主函数的写法也可以直接照搬。