c - 递归二叉树

标签 c recursion binary-tree

重点是打印二叉树,例如:

-------x--------
---x-------x----
-x---x---x---x--
x-x-x-x-x-x-x-x-
xxxxxxxxxxxxxxxx

我的代码是:

#include <stdio.h>
#include <math.h>

#define LENGTH 16

void makeBranches(int left, int right, char a[][LENGTH], int);
void display(char a[][LENGTH], int);

void main(){
  int i, lines;
  double a;

  a = log10(LENGTH*2)/log10(2);
  lines = (int)a; 
  char array[lines][LENGTH];

  makeBranches(0, LENGTH-1, array, 0);
  display(array, lines);
}

void makeBranches(int left, int right, char a[][LENGTH], int line){

  if(left >= right){
    a[line][left] = 'X';
    return;
  } else{
    a[line][(right+left)/2] = 'X';
    makeBranches(left, (right+left)/2, a, line+1);
    makeBranches((right+left)/2+1, right, a, line+1); 
  }
}

void display(char a[][LENGTH], int lines){
  int i, j;

  for(i = 0; i < lines; i++){
    for(j = 0; j < LENGTH; j++){
      if(a[i][j] == 'X')
    printf("%c", a[i][j]);
      else
    printf("-");      
    }
    printf("\n");
  }
}

这适用于 LENGTH 值 4、8、16,但当您尝试 32、64 等时,它有一些杂散的 X。例如:

长度 32

---------------X----X-------X---
-------X---------------X--------
---X-------X-------X-------X----
-X---X---X---X---X---X---X---X--
X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

长度 64

-------------------------------X--------------------------------
---------------X-------------------------------X----------------
-------X---------------X---------------X---------------X--------
---X-------X-------X-------X-------X-------X-------X-------X----
-X---X---X---X---X--XX---X--XX---X---X---X---X---X---X---X---X--
X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-X-
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

这一定是某个地方的简单修复,但我就是看不到它。希望有人可以。

最佳答案

char array[lines][LENGTH];

这将创建一个空数组,其中每个值都是当前内存中的任何值(有时为 0,但不保证为 0)。这意味着有时随机地,内存中已经包含一个“X”字节。您可以通过将数组初始化为全 0(即空字符,而不是“0”)来解决此问题:

memset(array, 0, LENGTH * lines);

或者:

for(size_t i = 0; i < lines; i++){
    for(size_t j = 0; j < LENGTH; j++){
        a[i][j] = 0;
    }
}

关于c - 递归二叉树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13299659/

相关文章:

c - sscanf 读取它不应该读取的内容

c - 我的树程序在插入一个根节点后崩溃

python - 使用递归的二叉树中的最低公共(public)祖先

c++ - 自上而下的动态编程 VS 递归朴素解决方案。检查运行时执行

c - 二叉搜索树 : lost pointer in insertion function

c - 我一辈子都弄不明白为什么我的 C 程序崩溃了

c - 为什么二维数组用于堆栈?为什么不能将一维数组用于堆栈?

c++ - 鉴于此示例,与使用多线程或进程相比,轮询设计对我有何好处?

c - C语言插入数据到二叉树

c - 为什么扫描 ("%s",&str);表现为 scanf ("%s",str);?