Cバージョンではノードのアドレス、つまりNode *のみが保存されていますが、Javaバージョンでは、ノード全体が保存されます。Javaでツリーを実装すると、C言語でアドレスを保持している次のノードv/s全体が保持される
これは、実行するJavaコードがCコードと比較してより多くのメモリを占有することを意味しますか?
Cバージョン
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node* left;
struct node* right;
}Node;
Node* root;
void inorder(Node* node)
{
if(node == NULL)
return;
inorder(node->left);
printf("%d ",node->data);
inorder(node->right);
}
void insert(int data)
{
printf("inside insert, data == %d",data);
Node* node = malloc(sizeof(Node));
node->data = data;
node->left = NULL;
node->right = NULL;
if(root == NULL)
{
printf("inserting %d as root",node->data);
root = node;
}
else
{
Node* trav = root;
Node* pretrav = root;
while(trav != NULL)
{
pretrav = trav;
if(node->data < trav->data)
trav = trav->left;
else
trav = trav->right;
}
if(node->data < pretrav->data)
{
printf("inserting %d to the left of %d",node->data, pretrav->data);
pretrav->left = node;
}
else
{
printf("inserting %d to the right of %d",node->data, pretrav->data);
pretrav->right = node;
}
}
}
int main(void)
{
int a[] = {10,5,15,1,20,100};
int i = 0;
for(i = 0;i<sizeof(a)/sizeof(a[0]);i++)
{
insert(a[i]);
printf("\n");
}
inorder(root);
return 0;
}
Javaバージョン
package lastcommon;
public class TreeExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
Tree tree = new Tree();
tree.insert(10);
tree.insert(5);
tree.insert(15);
tree.insert(1);
tree.insert(20);
tree.insert(100);
System.out.println("Printing inorder... ");
tree.inorder(tree.root);
}
}
class Node
{
int data;
Node left;
Node right;
public Node() {
// TODO Auto-generated constructor stub
left = right = null;
}
}
class Tree
{
Node root;
public Tree() {
// TODO Auto-generated constructor stub
root = null;
}
void inorder(Node node)
{
if(node == null)
return;
inorder(node.left);
System.out.println(node.data);
inorder(node.right);
}
void preorder(Node node)
{
if(node == null)
return;
System.out.println(node.data);
preorder(node.left);
preorder(node.right);
}
void postorder(Node node)
{
if(node == null)
return;
postorder(node.left);
postorder(node.right);
System.out.println(node.data);
}
void insert(int data)
{
Node node = new Node();
node.data = data;
if(root == null)
{
root = node;
return;
}
Node trav = root;
Node pretrav = root;
while(trav != null)
{
pretrav = trav;
if(node.data < trav.data)
{
trav = trav.left;
}
else
{
trav = trav.right;
}
}
if(node.data < pretrav.data)
pretrav.left = node;
else
pretrav.right = node;
}
}
ありがとうございます。新しいキーワードを使用すると、クラスの新しいインスタンスが作成され、新しく作成されたインスタンスのアドレスが返されます。私が想定したように、新しく割り当てられたブロック全体を返さないのですか? – saltandwater
はい。これは直感的ではありません。 –
Cでnode.dataはノードが実際のメモリブロックであり、node-> dataだけがノードによって保持されているアドレスに対応するブロックであることを意味するので、最初は混乱しました。しかし、Javaでは、node.data自体は、ノードが保持するアドレスのブロックです。 – saltandwater