如果左子树的深度小于右子树的深度,我需要算法检查二叉树中的每个点头,返回true或false。 它必须在O(n)。
我认为构建一个计算每个子树深度的函数,如果左子树的深度小于右子树的深度,则使用它来检查每个节点,但我认为这将是O(n ^ 2)
答案 0 :(得分:1)
正确:那将结束O(n ^ 2)。你需要通过深度优先搜索来做到这一点。编写一个函数,确定以节点n
为根的子树的深度。它需要一个节点,(递归地)询问左子树的深度和右子树的深度。返回(int, boolean)
对int
,其中boolean
是两个子树深度中的最大值,true
如果false
为{{1}}则为{{1}},如果{{1}}为{{1}}不
现在您只需在根节点上调用它。它将递归计算树的每个节点上的深度和平衡信息。
如果你可以改变节点并放入一个可以用来用答案注释每个节点的字段,你可以在不返回一对的情况下完成它,就像在u_seem_surprised的解决方案中一样。但不管怎样,它现在都是O(n)。
答案 1 :(得分:1)
递归dfs解决方案:
struct node{
int val;
bool leftGreater;
struct node *left, *right;
};
int solve(Node *n){
if(n == NULL){
return 0;
}
int left = solve(n->left) + 1;
int right = solve(n->right) + 1;
if(left > right){
n->leftGreater = true;
}else{
n->leftGreater = false;
}
return max(left, right);
}