我必须遍历一个给定深度的二叉树,然后确定该深度之后的节点数,但是我在确定如何遍历给定深度时遇到一些麻烦。到目前为止我所拥有的是。
{{1}}
我可能在递归方面做错了,但我的想法是左边或右边的深度是否等于给定的深度,然后增加深度并再次运行。如果它在正确的深度,那么它应该为计数加1并继续。
答案 0 :(得分:0)
在我们弄清楚如何做之前,让我们逐行分析下面的代码......
public static int sizeBelow (Node x, int y) { // y is very ambiguous
if (t == null) {// I am guessing t should be x
return 0;
}else{
int count = 0; // the number of nodes below the depth barrier y
int leftDepth = 0; // this will always be 0 since you never alter it
int rightDepth = 0; // this to
if(leftDepth < y){ // this will never not go off unless y is 0
leftDepth=1+sizeBelow(x.left, y); // we must decrement y
}else{ // or we will never enter here
count=1+sizeBelow(x.left,y); // this should be + =
}
if(rightDepth < y){ // this will also never not go off
rightDepth= 1+sizeBelow(x.right,y); // y is again not decremented
}else{ // this will never be reached
count=1+sizeBelow(x.right,y); // this to
}
return count;
}
你必须明白,在递归中,每个函数调用都使用恰好具有相同名称的新变量,除非你传递它们,否则在递归调用中永远不会考虑右深度和左深度的变化。
这是我改变的代码
public static int sizeBelow (Node x, int depth) {
if (x == null) {
return 0;
}else{
int count = 0;
if(depth == 0){
count +=sizeBelow(x.left, (depth - 1));
count +=sizeBelow(x.right, (depth - 1));
}else{
count +=1+sizeBelow(x.left,depth);
count +=1+sizeBelow(x.right,depth);
}
return count;
}
答案 1 :(得分:0)
您可以使用Depth / Breadth first search搜索二叉树。但是做一些改变:
在函数外创建一个变量:
int count = 0;
为递归函数添加一个额外的布尔参数:
public static int sizeBelow(Node x, boolean afterNode){
点击Node后,使用if语句并将布尔值设置为true:
if(currentNode == x || afterNode){
return sizeBelow(currentNode.right, true);
else{
return sizeBelow(currentNode.right, false);
对左孩子采用相同的方法
然后添加条件:
if(afterNode){
if(currentNode.right != null){
count++;
}
}
再次为左孩子应用相同的方法。
你看到了这种方法吗?
您可以使用任何二叉树搜索算法