统计二叉树中只有右子树或左子树但不同时出现的结点个数
#include<bits/stdc++.h>
using namespace std;
#define maxn 100001
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct node{
char ch;
struct node *Lchild;
struct node *Rchild;
}BiTNode,*BiTree;
void Q_CreatTree(BiTree *T);
int NodeNumber_1(BiTree T);
int NodeNumber_2(BiTree T);
int NodeNumber_0(BiTree T);
void Deepth(BiTree T,int *h);
void Q_CreatTree(BiTree *T){
char str;
str=getchar();
if(str=='#')
{
*T=NULL;
}
else
{
(*T)=(BiTree)malloc(sizeof(BiTNode));
(*T)->ch=str;
Q_CreatTree( &( (*T)->Lchild ) );
Q_CreatTree( &( (*T)->Rchild ) );
}
}
void Deepth(BiTree T,int *h)
{
if(T)
{
if(T->Lchild&&!T->Rchild||!T->Lchild&&T->Rchild){
(*h)+=1;
}if(T->Lchild&&T->Rchild){
(*h)+=0;
}else if(!T->Lchild&&!T->Rchild){
(*h)+=0;
}
Deepth(T->Lchild,h);
Deepth(T->Rchild,h);
}
}
int main(void){
int n=1;
getchar();
while(n--){
int h = 0;
BiTree T;
Q_CreatTree(&T);
getchar();
Deepth(T,&h);
printf("%d\n",h);
}
return 0;
}
各位看一下哪里出错了
【以下回答由 GPT 生成】
问题解答:
这段代码中有几个错误需要修改:
NodeNumber_1
、NodeNumber_2
和NodeNumber_0
中,需要先判断树是否为空,如果为空则返回0。否则,递归地计算左子树和右子树中只有右子树或左子树但不同时出现的节点个数。int NodeNumber_1(BiTree T) {
if (T == NULL) {
return 0;
}
return NodeNumber_1(T->Lchild) + NodeNumber_2(T->Rchild) + ((!T->Lchild && !T->Rchild) ? 1 : 0);
}
int NodeNumber_2(BiTree T) {
if (T == NULL) {
return 0;
}
return NodeNumber_2(T->Lchild) + NodeNumber_1(T->Rchild) + ((!T->Lchild && !T->Rchild) ? 1 : 0);
}
int NodeNumber_0(BiTree T) {
if (T == NULL) {
return 0;
}
return NodeNumber_0(T->Lchild) + NodeNumber_0(T->Rchild) + ((!T->Lchild && !T->Rchild) ? 1 : 0);
}
Deepth
中,递归计算只有右子树或左子树但不同时出现的节点个数时,应该传入h + 1
作为参数,因为当前节点满足条件。void Deepth(BiTree T, int *h){
if(T){
if((T->Lchild && !T->Rchild) || (!T->Lchild && T->Rchild)){
(*h)++;
}
Deepth(T->Lchild, h + 1);
Deepth(T->Rchild, h + 1);
}
}
修改后的代码如下:
#include<bits/stdc++.h>
using namespace std;
#define maxn 100001
typedef struct node{
char ch;
struct node *Lchild;
struct node *Rchild;
}BiTNode, *BiTree;
void Q_CreatTree(BiTree *T);
int NodeNumber_1(BiTree T);
int NodeNumber_2(BiTree T);
int NodeNumber_0(BiTree T);
void Deepth(BiTree T, int *h);
void Q_CreatTree(BiTree *T){
char str;
cout << "请输入下一个节点字符:";
cin >> str;
if(str == '#') {
*T = NULL;
}
else{
(*T) = (BiTree)malloc(sizeof(BiTNode));
(*T)->ch = str;
Q_CreatTree(&( (*T)->Lchild ));
Q_CreatTree(&( (*T)->Rchild ));
}
}
int NodeNumber_1(BiTree T) {
if (T == NULL) {
return 0;
}
return NodeNumber_1(T->Lchild) + NodeNumber_2(T->Rchild) + ((!T->Lchild && !T->Rchild) ? 1 : 0);
}
int NodeNumber_2(BiTree T) {
if (T == NULL) {
return 0;
}
return NodeNumber_2(T->Lchild) + NodeNumber_1(T->Rchild) + ((!T->Lchild && !T->Rchild) ? 1 : 0);
}
int NodeNumber_0(BiTree T) {
if (T == NULL) {
return 0;
}
return NodeNumber_0(T->Lchild) + NodeNumber_0(T->Rchild) + ((!T->Lchild && !T->Rchild) ? 1 : 0);
}
void Deepth(BiTree T, int *h){
if(T){
if((T->Lchild && !T->Rchild) || (!T->Lchild && T->Rchild)){
(*h)++;
}
Deepth(T->Lchild, h + 1);
Deepth(T->Rchild, h + 1);
}
}
int main(){
int n = 1;
getchar();
while(n--){
int h = 0;
BiTree T;
Q_CreatTree(&T);
getchar();
Deepth(T, &h);
cout << h << endl;
}
return 0;
}
希望对你有所帮助。如果还有其他问题,请随时提问。
【相关推荐】
在创建二叉树的函数Q_CreatTree()
中,您读取字符时使用了getchar()
函数。但由于getchar()
只会读取一个字符,会导致一个问题。在读取完一个字符后,下一个字符可能会是空格、换行符或其他非叶子节点字符,这样就会导致读取的字符不符合预期。建议使用cin
来读取整行输入,并将输入传递给Q_CreatTree()
函数处理。
在计算二叉树深度的函数Deepth()
中,对于度为1的节点的判断逻辑有误。由于递归遍历的顺序是先遍历左子树再遍历右子树,所以在遍历一个节点时,应先判断右子树是否为空,再判断左子树是否为空。修改判断逻辑后,可以正确计算度为1的节点个数。
修改后的代码如下: