【发布时间】:2017-10-07 00:34:10
【问题描述】:
我正在做一个涉及平衡二叉树的项目,但遇到了一些问题。
对于我项目的一部分,我想查看一棵树(或子树)并比较所述子树左孩子路径和右孩子路径的最大长度。如果这些路径的最大长度之间的绝对差大于 1,我想返回找到的第一个具有此属性的节点。逻辑有点简单..例如,如果我有树:
我的算法将查看 64 并比较沿左侧和右侧向下的路径长度(分别为 5 和 4)。这不会创建一个标志,因为差异是 1。然后我会递归地查看 64 的孩子。首先它会查看 43,然后转到 26。在 26 之后(因为它的每个子节点到叶子的长度为 1),算法将移动到 62。此时将抛出一个标志,因为 62s 左路径有一个长度3,它没有正确的路径。这是我想退出循环并返回 62 的地方。但是,我的循环继续运行,直到它检查最终节点。
如您所见,算法继续运行并返回一个空节点,而不是我想要的节点。我不确定它为什么这样做,但我认为它与优先级和范围有关。具体算法代码如下:
public BinaryNode<Integer> NodeCheck(BinaryNode<Integer> Node) throws IllegalStateException
{
System.out.println("CHECKING NODE: " + Node.getData());
int leftHeight = 0;
int rightHeight = 0;
if (Node.hasLeft())
{
leftHeight = 1 + findHeight(Node.getLeft());
}
if (Node.hasRight())
{
rightHeight = 1 + findHeight(Node.getRight());
}
System.out.println("LEFT HEIGHT = " + leftHeight);
System.out.println("RIGHT HEIGHT = " + rightHeight);
int z = Math.abs(leftHeight - rightHeight);
if (z > 1)
{
System.out.println();
System.out.println();
System.out.println("PROBLEM DETECTED AT NODE " + Node.getData() + " ATTEMPTING TO RETURN NODE");
BinaryNode<Integer> flag = createNode(Node.getData(), Node.getParent(),Node.getLeft(), Node.getRight());
return flag;
}
for (BinaryNode<Integer> c : children(Node))
{
if (findHeight(c) > 1 && z<= 1)
{NodeCheck(c);}
}
return createNode(0,null,null,null);
}
我认为重要的是要注意我最终处理了 if (z > 1) 语句中的信息,因为 System.out.println() 语句已执行,这使我相信 return 语句已执行。但是,这并没有像我想象的那样退出函数。
【问题讨论】: