. 为什么l不为0,就找到所在层次。 else return l; 3.为什么l=0时候,才做右子树的遍历。这个判断条件可以去掉么? if (l==0) return Level(b->rchild,x,h+1); int Level(BTNode b,ElemType x,int h) //找到p结点后h为其层次,否则为0 { if (b==NULL) return 0; else if (b->data==x) return h; else { l=Level(b->lchild,x,h+1); if (l==0) return Level(b->rchild,x,h+1); else return l; } }
时间: 2023-06-09 16:03:27 浏览: 36
这是一段二叉树的查找代码,参数 x 表示要查找的元素,参数 h 表示当前节点所在的层次。当节点为空时返回0,查找到目标元素时返回当前层次 h,否则继续向下递归查找。如果左子树中找到目标元素,直接返回其层次;若左子树中没有找到,则需要向右子树中继续查找,此时需要再次调用 Level 函数查找右子树中的目标元素,层次 h 需要加 1。当 l=0 时,表示在左子树中未找到目标元素,则需要继续在右子树中查找,这时需要添加判断条件,否则会陷入死循环,因为无法确定目标元素在左子树还是右子树中。因此,不能去掉这个判断条件。
相关问题
不带头结点的插入操作.为什么不用 L->next 呢
不带头结点的链表表示法中,第一个节点即为头节点,因此在插入操作时,我们需要对第一个节点进行特殊处理。如果使用 L->next 进行插入操作,会直接修改第一个节点,而不是插入一个新节点。因此,我们需要使用指向第一个节点的指针进行插入操作,而不是直接使用 L->next。具体实现可以参考如下代码:
```c++
void insert(Node* &L, int val) {
// 创建新节点
Node* node = new Node(val);
if (L == nullptr) { // 链表为空
L = node;
} else { // 链表不为空
node->next = L;
L = node;
}
}
```
其中,使用了指向第一个节点的指针 L 进行插入操作。如果链表为空,直接将新节点设置为第一个节点;否则,将新节点插入到第一个节点位置,然后将新节点设置为第一个节点。
Delphi LRight := FStack.Pop as TExprNode这句有什么问题
这句代码的问题在于它使用了 as 操作符进行类型转换,但是在 FStack.Pop 返回的对象不是 TExprNode 类型时,会引发异常。为了避免异常,可以使用 is 操作符进行类型检查,然后再使用 as 操作符进行类型转换。例如:
```
if FStack.Peek is TExprNode then
LRight := FStack.Pop as TExprNode
else
// 处理类型错误的情况
```