enter code here
#include <stdio.h>
#include <stdlib.h>
typedef struct _node {
int data;
struct _node* rightChild;
struct _node* leftChild;
}Node;
Node* create(int data) { // create node function
Node* node = (Node*)malloc(sizeof(node));
node->rightChild = NULL;
node->leftChild = NULL;
node->data = data;
return node;
}
void Inorder(Node* ptr) { // travel
if (ptr)
{
printf("%c ", ptr->data);
Inorder(ptr->leftChild);
Inorder(ptr->rightChild);
}
}
int main(void)
{
Node* node[300];
for (int i = 1; i < 300; i ) {
if (i == 1) {
node[i] = create(i);
}
else {
if (i % 2 == 0) {
node[i / 2]->leftChild = create(i);
}
else {
node[i / 2]->rightChild = create(i);
}
}
}
Inorder(node[10]);
}
我想使用 Node* 陣列來實作二叉樹,而不是一個一個地輸入變數。但我一直在該領域遇到錯誤。感謝您的建議。我需要修改哪個部分才能通過 for 陳述句實作該部分?據我了解,節點陣列的左右部分都傳遞了值,那么為什么會出現錯誤?
uj5u.com熱心網友回復:
您唯一node[i]分配給的是node[1]. 所有其他節點都通過leftChildorrightChild欄位鏈接。
您可以通過執行以下操作來解決此問題,例如:
node[i] = create(i);
node[i / 2]->leftChild = node[i];
但這有點迂回,因為您現在在兩個不同的地方擁有相同的資料——節點的句柄。
我的猜測是你真正想要的是一個簡單的節點結構陣列,然后通過指標鏈接到陣列中:
Node node[300] = {{0}};
node[1].data = 1;
for (int i = 2; i < 300; i ) {
node[i].data = i;
if (i % 2 == 0) {
node[i / 2].leftChild = &node[i];
} else {
node[i / 2].rightChild = &node[i];
}
}
這將創建一個平面節點陣列,其中節點像二叉樹一樣鏈接。例如,node[1].leftChild是一個指向node[2]. 您可以通過&node[1]作為 head 傳遞來使用常規樹函式:
Inorder(&node[1]);
(你所說Inorder的實際上是一個前序遍歷。)
優點是您不需要create分配任何東西。結束時main,整棵樹都消失了,無需free. (它還消除了 中的一個錯誤create,您只為指標分配空間,而不是為節點分配空間;它應該是node = malloc(sizeof(*node));。)
也許這不是您想要的,但是您的代碼中的錯誤來自node[2]未設定時的訪問。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/477677.html
