我实现了下面的C代码,以检查二叉树是否平衡,即左右子树的高度相差最多1。但是,我不确定它是否有效,或者以错误的方式重复检查子树。有人能引导我吗?
unordered_map <Node*, int> height;
struct Node{
int key;
Node* left;
Node* right;
}
bool isBalanced(Node* root){
if (root == nullptr){
height[root] = -1;
return true;
}
if (!isBalanced(root->left)) return false;
if (!isBalanced(root->right)) return false;
height[root] = max(height[root->left], height[root->right]) + 1;
return (abs(height[root->left] - height[root->right]) < 1);
}
我将尝试使用伪代码传递这个想法。
int CheckTreeHeight(Node root)
{
if(root == null) return 0; // Height of 0.
// Check if left is balanaced
int leftChildHeight = CheckTreeHeight(root.left);
if(leftChildHeight == -1) return -1; // Not Balanced
// Check if right is balanaced
int rightChildHeight = CheckTreeHeight(root.right);
if(rightChildHeight == -1) return -1; // Not Balanced
// Check if current node is balanced
int heightDifference = leftChildHeight - rightChildHeight;
if(Math.abs(heightDifference) > 1)
return -1; // not balanaced
else
return Math.max(leftChildHeight, rightChildHeight) + 1; // Return Height
}
bool IsBalanced(Node root)
{
if(CheckTreeHeight(root) == -1)
{
return false;
}
else
{
return true;
}
}
该算法在< code>O(n)时间复杂度和< code>O(H)空间复杂度下执行,其中< code>h是树的高度。
正如算法的作者所提到的,我们的想法是递归地检查根的子级(即左
和右
),直到我们找到不平衡的子级,在那里我们返回-1
。
使用这种技术,如果任何子树不平衡,我们立即返回。
关于这个实现的更多信息,您可以在下面提到的参考资料中找到。
参考< br >破解编码面试第6版
QSTN:当它是叶节点时,为什么需要初始化ls=0或rs=0。考虑链接中给出的树,如果我们到达节点4,如果(node==NULL isLeaf(node))返回1;上面的代码将1(true)返回到调用它的函数,即节点10,类似地,右侧将true返回到节点10,因此我们现在可以进入下面的循环,因为如果(isSumTree(node->left)&&isSumTree(node->left)&&isS
我正试图解决这个问题,但我遇到了一些麻烦: 在二进制搜索树(BST)中: 节点左子树中每个节点的数据值小于该节点的数据值。 节点右侧子树中每个节点的数据值大于该节点的数据值。 如您所见,节点(4)位于节点(3)的左侧子树中,尽管4大于3,因此方法应该返回。但是,我的代码返回。 我怎么能控制这个案子?如何检查左/右子树中的所有值都低于/大于根(不仅是直接子树)?
如何检查由数组表示的给定完整二叉树是否是值平衡二叉树?我所说的值平衡是指,如果对于每个节点,左手边节点的整数值之和等于右手边的值之和。什么是类C算法?找出有孩子的节点的索引很容易。但是我无法开发递归计算每个节点总和的逻辑。还需要以这样一种方式计算总和,即特定节点下方左子树的所有节点的总和将等于它的右手对应物,并以类似的方式向下挖掘。怎么可能使用数组?
编写一个Lisp程序来检查一个二叉树是否是二叉搜索树。 我正在尝试编写一个二进制递归方法,但我是一个初学者,我不知道从这里去哪里。
我知道如何检查给定的树是否是二叉树。但问题是,如果树包含重复的值,该怎么办。 如何检查可能包含重复值的树是否是二叉查找树重复值必须位于树/子树的右侧。
我想写一个方法来确定一棵树是否至少有一对相同的子树,这些子树的值和结构都必须相同。 假设给你一棵树,如下所示: 这将返回,因为我们有一对根为的相同树。 我的想法是遍历每个节点,构建一个映射到