簡體   English   中英

遞歸二叉樹

[英]Recursive 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");
  }
}

對於4、8、16的LENGTH值,這很好用,但是當您嘗試使用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,但不能保證是)。 這意味着有時,存儲器中已經隨機包含一個“ 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;
    }
}

您的arraymain的局部變量,並且您絕不會初始化其大多數值。 未明確初始化的局部變量開始時包含“隨機垃圾”,這不是真正的“隨機”,但足夠“垃圾”,因此您無法確定某些位置不會意外包含值“ X”原來。

首先遍歷整個數組並將所有位置初始化為已知的位置。

(挑剔的語言律師會知道,“隨機垃圾”並不是統一本地人所發生的技術上正確的術語,但它足以在實際編程中充當思維模型)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM