Performance 找出一个二叉树是平衡的还是无效的
如果一棵二叉树的左子树和右子树都是平衡的,并且左子树和右子树的高度之差小于或等于1,则称之为高度平衡 我必须找出给定的二叉树是否平衡 基于上述概念,我使用了以下代码:Performance 找出一个二叉树是平衡的还是无效的,performance,algorithm,binary-tree,Performance,Algorithm,Binary Tree,如果一棵二叉树的左子树和右子树都是平衡的,并且左子树和右子树的高度之差小于或等于1,则称之为高度平衡 我必须找出给定的二叉树是否平衡 基于上述概念,我使用了以下代码: bool isbalanced(struct node *root) { int left,right; if(root==NULL) return true; else { left=height(root->left); right=height(r
bool isbalanced(struct node *root)
{
int left,right;
if(root==NULL)
return true;
else
{
left=height(root->left);
right=height(root->right);
if(abs(left-right)<=1 && isbalanced(root->right)==true && isbalanced(root->left)==true)
return true;
else
{
return false;
}
}
}
如果树是平衡的或不平衡的,我得到了正确的解决方案。但是如果给定的树是倾斜的,那么时间复杂度将是O(n^2)
是否有一种方法可以让我以更有效的方式完成此任务?您将遍历左子树和右子树两次:一次是为了获得它们的高度,另一次是为了测试它们是否平衡。通过使用同时包含高度和平衡标志的结构,将一个结构向下传递,由左子树填充,另一个由右子树填充,可以减少一半的工作量 然后,通过在扫描右侧时使用左侧子树中的信息(反之亦然),您可以进一步改进这一点。在许多情况下,如果整个树不平衡,但每个子树都平衡,则可以使用左子树信息(与适当的簿记1一起)提前切断右子树搜索
1簿记详细信息留给读者作为练习您将遍历左子树和右子树两次:一次是为了获得它们的高度,另一次是为了测试它们是否平衡。通过使用同时包含高度和平衡标志的结构,将一个结构向下传递,由左子树填充,另一个由右子树填充,可以减少一半的工作量 然后,通过在扫描右侧时使用左侧子树中的信息(反之亦然),您可以进一步改进这一点。在许多情况下,如果整个树不平衡,但每个子树都平衡,则可以使用左子树信息(与适当的簿记1一起)提前切断右子树搜索
1簿记详细信息留给读者作为练习考虑到给定的树是根树,我们可以通过对给定树的单个深度优先搜索来计算所有节点的高度。拟议解决方案示意图:
int isbalanced(struct node *root)
{
int left,right;
if(root==NULL)
return 0;
else
{
left=isbalanced(root->left);
right=isbalanced(root->right);
if(left==-1||right==-1||fabs(left-right)>1){
return -1; // it indicates the tree rooted at root or below is imbalanced
}else{
return max(right,left)+1;
}
}
}
如果上述函数返回-1,则树是不平衡的,否则是平衡的。它不需要高度函数
运行时:O(V+E)
请注意:未测试代码考虑到给定的树是一棵有根树,我们可以通过对给定树进行一次深度优先搜索来计算所有节点的高度。拟议解决方案示意图:
int isbalanced(struct node *root)
{
int left,right;
if(root==NULL)
return 0;
else
{
left=isbalanced(root->left);
right=isbalanced(root->right);
if(left==-1||right==-1||fabs(left-right)>1){
return -1; // it indicates the tree rooted at root or below is imbalanced
}else{
return max(right,left)+1;
}
}
}
如果上述函数返回-1,则树是不平衡的,否则是平衡的。它不需要高度函数
运行时:O(V+E)
请注意:未测试代码