当前位置: 首页 > 知识库问答 >
问题:

后端 - 二叉树中序遍历?

卫烨烁
2023-05-04

二叉树遍历崩溃求大神帮我分析分析

#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode//
{
    char data;
    struct BiTNode *rchild;
    struct BiTNode *lchild;
    
} BiTNode,*BiTree;
void CreateBiTree(BiTree *T)//先序创建二叉树 
{ 
    char ch;
    scanf("%c",&ch);
    if(ch=='#')
    (*T)==NULL;
    else
    {
         
        (*T)=(BiTNode* )malloc(sizeof(BiTNode));
        (*T)->data=ch;            
        CreateBiTree(&(*T)->lchild);
        CreateBiTree(&(*T)->rchild);    
    }
}

void InOrderTraverse( BiTree T)//中序遍历输出 
{
        if(T!=NULL)        
        InOrderTraverse(T->lchild);
        printf("%c",T->data);
        InOrderTraverse(T->rchild);        
}

int NodeCount(const BiTree T)//计算元素个数 
{
    if(T==NULL) return 0;
    else    return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
}


int main() //主函数
{  
    BiTree T;
    printf("按先序依次输入字符:\n");
    CreateBiTree(&T);
    printf("创建成功\n");
    printf("\n\n中序遍历二叉树结果:\n");
    InOrderTraverse(T);
    printf("\n遍历成功\n");   
    printf("\n\n元素个数为:%d\n",NodeCount(T));
}

以下是我同学的代码可以跑

typedef struct BitNode
{
    char data;
    struct BitNode *Rchild;
    struct BitNode *Lchild;
} BiTNode,*BiTree;


void CreateBiTree(BiTree *T)
{
    char ch;
    scanf("%c",&ch);
    if(ch == '#')
    {
        *T = NULL;
    }
    else
    {
        *T = (BiTree)malloc(sizeof(BiTNode));
       
        (*T)->data = ch;
        CreateBiTree(&(*T)->Lchild);
        CreateBiTree(&(*T)->Rchild);
    }
}

//二叉树的中序遍历
void InOrderTraverse(BiTree T)
{
    if(T == NULL) return;
    InOrderTraverse(T->Lchild);
    printf("%c ",T->data);
    InOrderTraverse(T->Rchild);
}

//求二叉树的节点个数
int NodeCount ( BiTree T)
{
    if(T==NULL) return 0;
    else return NodeCount(T->Lchild) + NodeCount(T->Rchild) + 1;
}
main()
{
    printf("请输入节点信息\n");
    BiTree T;
    CreateBiTree(&T);

    printf("\n\n中序遍历结果为 :\n");
    InOrderTraverse(T);
    printf("\n\n二叉树的节点个数为:\n%d\n", NodeCount(T));
 
    return 0;
}

实在是看不出哪里有什么不同

共有1个答案

翁凯定
2023-05-04
你可以通过
```代码```的形式来上传你的代码块。

首先问题在于你的 CreateBiTree 方法。

void CreateBiTree(BiTree *T) // 先序创建二叉树
{
  char ch;
  scanf("%c", &ch);
  if (ch == '#')
    (*T) == NULL; // 这里不能用 == ! 应该是 = !
  else {
    (*T) = (BiTNode *)malloc(sizeof(BiTNode));
    (*T)->data = ch;
    CreateBiTree(&(*T)->lchild);
    CreateBiTree(&(*T)->rchild);
  }
}

方法 InOrderTraverse 也存在问题。

void InOrderTraverse(BiTree T) // 中序遍历输出
{
  if (T != NULL)
    InOrderTraverse(T->lchild); 
  printf("%c", T->data);    // 即使 T 是 NULL, 他仍然会执行这个代码。
  InOrderTraverse(T->rchild);
}

如果 T 没有左孩子,但他存在,那么在下面的 printf("%c", T->data) 中就会因为找不到对应的 data 而发生错误。你同学写的是正确的。

 类似资料:
  • 中序遍历二叉树 按完全二叉树的层次遍历给出一棵二叉树的遍历序列(其中用0表示虚结点),要求输出该二叉树的深度及中序遍历该二叉树得到的序列。 输入格式: 首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据首先输入一个正整数n(n≤1000),代表给出的二叉树的结点总数(当然,其中可能包含虚结点)。结点编号均为正整数,且各不相同。 然后输入n个正整数,表示按完全二叉树(即第1层1

  • 我想仅使用一个堆栈对二叉树进行后序遍历。这是我的代码,首先我将左侧元素推入堆栈,直到达到null。然后我弹出一个元素并检查弹出的元素和当前堆栈顶部的右侧元素是否相同。但不知何故,这将进入无限循环。你能告诉我为什么吗??

  • 为了上课,我必须创建一个状态对象的二叉树,每个状态对象包括一个居民对象的二叉树,这些居民对象组织住在每个州的人。我试图在一个给定的州中搜索最老的居民;然而,居民是按字母顺序组织在树中的,这对我的搜索毫无帮助。因此,我必须遍历整个居民树,更新保存最老的人的节点,并在树被完全遍历后返回它。我已经有了代码的第一部分,但是还停留在如何写递归的剩余部分。 状态树的方法: 然后是公共“包装器”状态树方法:

  • NowCoder 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。 例如,下图是后序遍历序列 1,3,2 所对应的二叉搜索树。 解题思路 // java public boolean VerifySquenceOfBST(int[] sequence) { if (sequence == null || sequence.l

  • 我在编码挑战中遇到了一个问题。 完整二叉树是一种二叉树,其中除叶节点外的每个节点都有两个子节点,且树的最后一级边高度有叶节点。 您的任务很简单,给定完整二叉树的遍历,请按顺序遍历打印其

  • 一、题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true。否则返回false。假设输入的数组的任意两个数字都互不相同。 二、解题思路 在后序遍历得到的序列中, 最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分: 第一部分是左子树结点的值,它们都比根结点的值小: 第二部分是右子树结点的值,它们都比根结点的值大。 三、解题代码 public class