以下是我的代码需要做的图片。
Before Call:
+----+
| -9 |
+----+
/ \
/ \
+----+ +----+
| 3 | | 15 |
+----+ +----+
/ / \
/ / \
+----+ +----+ +----+
| 0 | | 12 | | 24 |
+----+ +----+ +----+
/ \
/ \
+----+ +----+
| 6 | | -3 |
+----+ +----+
After Call:
+----+
| -9 |
+----+
/ \
/ \
+----+ +----+
| 6 | | 30 |
+----+ +----+
/ / \
/ / \
+----+ +----+ +----+
| 0 | | 24 | | 48 |
+----+ +----+ +----+
/ \
/ \
+----+ +----+
| 12 | | -3 |
+----+ +----+
基本上这个问题要求我在二进制整数树中将所有大于0的数据值加倍。我的下面的代码执行了一些值,但提前停止。我不知道如何递归地解决这个问题。这就是我上面给出的树的输出结果。
overallRoot
_[-9]_______________
/ \
_[6] _____[30]
/ / \
[0] _[12] [24]
/ \
[6] [-3]
public void doublePositives() {
doublePositives(overallRoot);
}
private IntTreeNode doublePositives(IntTreeNode root) {
if(root != null) {
if(root.data > 0) {
root.data = 2* root.data;
}else {
root.left = doublePositives(root.left);
root.right= doublePositives(root.right);
}
}
return root;
}
答案 0 :(得分:5)
如果要加倍节点,仍需要遍历树。删除else
以便始终遍历。此外,我已删除了分配,因为您没有更改树结构:
if(root != null) {
if(root.data > 0) {
root.data = 2 * root.data;
}
doublePositives(root.left);
doublePositives(root.right);
}
答案 1 :(得分:5)
看起来像一个逻辑问题 - 您只会将负节点子项的值加倍:
if(root.data > 0) {
root.data = 2* root.data;
}else {
root.left = doublePositives(root.left);
root.right= doublePositives(root.right);
}
如果根值为正 - 你永远不会到root.left& root.right。这样的事情会更好:
if(root.data > 0) {
root.data = 2* root.data;
}
root.left = doublePositives(root.left);
root.right= doublePositives(root.right);
答案 2 :(得分:3)
试试这个: 你在条件陈述中犯了错误。这应该是这样写的。如果root数据是正数 - 让它加倍,罗杰那!出来!在下一步中,继续左右子节点。
另外注意一下,你不需要在递归函数 doublePositives()中返回任何东西(除了void)。
public void iWillDoit() {
doublePositives(Root);
}
private void doublePositives(IntTreeNode root) {
if(root != null) {
if(root.data > 0)
{
root.data = 2* root.data;
}
doublePositives(root.left);
doublePositives(root.right);
}
}
答案 3 :(得分:2)
当root为正数时,你不会进行递归调用。
只有当根是否定时,才会执行递归调用。要解决此问题,请删除其他内容。
private IntTreeNode doublePositives(IntTreeNode root) {
if(root != null) {
if(root.data > 0) {
root.data = 2* root.data;
}
root.left = doublePositives(root.left);
root.right= doublePositives(root.right);
}
return root;
}