【发布时间】:2010-11-08 09:01:37
【问题描述】:
嗯,我已经研究了一段时间...试图找出一种算法来将我的随机数列表插入二叉树。
这是我目前得到的:
NodePtr 和 Tree 是指向节点的指针
NodePtr CreateTree(FILE * fpData)
{
int in;
fscanf(fpData, "%i", &in);
Tree T = (NodePtr)malloc(sizeof(Node));
T->Left = NULL;
T->Right = NULL;
T->value = in;
while((fscanf(fpData, "%i", &in)) != EOF)
{
InsertInTree(in, T);
printf("\n %p", T);
}
return T;
}
void InsertInTree(int value,Tree T)
{
if(T == NULL)
{
T->Left = (NodePtr)malloc(sizeof(Node));
T->Left->Left = NULL;
T->Left->Right = NULL;
T->Left->value = value;
printf("\n %i ", value);
return;
}
if(T->Left == NULL)
{
InsertInNull(value, T->Left);
}
else if(T->Right == NULL)
{
InsertInNull(value, T->Right);
}
else
{
if(T->Left->Left == NULL || T->Left->Right == NULL) InsertInTree(value, T->Left);
else InsertInTree(value, T->Right);
}
}
如果特定节点的两个子节点都不为空,我不知道该怎么办。我在这里所做的适用于少量数字(1、2、3、5、6),但如果列表更大,它就会变得不平衡和错误。
【问题讨论】:
-
这个二叉树的目的是什么?例如,在二叉搜索树中,在每个节点处,您将插入的值与节点处的值进行比较。如果它小于(或等于)您检查左子树的值。如果它更大,你检查的权利。每当您尝试检查一个空的子树时,您都会创建一个新的叶节点并为其提供您要插入的值。你似乎总是走目前没有人的那条路?
-
您的选择是重新平衡自己。或者使用稍微不同的算法,例如自动重新平衡的 [红黑树][1]。 [1]:en.wikipedia.org/wiki/Red-black_tree
-
我想我知道我现在需要做什么......我可能误解了我对这棵二叉树的假设。我需要订购它。谢谢大家。
标签: c tree binary-tree