文章
5
粉丝
0
获赞
0
访问
2.6k
(1)递归访问二叉树,递归过程中不断更新一颗子树的数值区间 ,并将这个区间作为递归的返回值。一个结点子树全部访问完成后收到左右子树两个区间<a,b>,<c,d>,设当前结点值为x,即比较x-b和c-x的值就可以确定这个结点是否满足条件。
(2)
int countNodes(TreeNode *root)
{
return visit(root)[2];
}
array<int,3> visit(TreeNode *node)//返回值依次为<左区间,右区间,当前子树中满足条件的结点个数>
{
int left = node->val,right = node->val;//区间也要包含当前结点的值
int res = 0;//记录子树中答案个数
int d = -1;
if(node->left!=NULL)//左子树的值只会小于当前结点
{
array<int,3> a = visit(node->left);
left = min(left,a[0]);
res += a[2];
d = node->val - a[1];//记录当前结点与左子树距离最小值
}
if(node->right!=NULL)
{
array<int,3> a = visit(node->right);
right = max(right,a[1]);
res += a[2];
if(d == a[0]-node->val)//比较与左右子树的距离最小值检查当前结点是否符合条件
res++;
}
return <left,right,res>;
}
(3)时间复杂度O(n)
评分及理由
(1)得分及理由(满分3分)
得分:3分
理由:学生的设计思想正确,采用后序遍历(递归访问二叉树)并维护子树的数值区间(最小值和最大值),利用二叉搜索树的性质,通过比较当前结点值与左子树最大值和右子树最小值的差值来判断条件是否满足。思路与标准答案中的最优解一致,描述清晰。
(2)得分及理由(满分9分)
得分:6分
理由:学生代...
登录后发布评论
暂无评论,来抢沙发