在二叉树中,由于不同的需求,不同的人对数据的插入可能不同。
在此由于刚开始学习树的插入,在不考虑树的排序的情况下,想对树进行插入操作,但是由于树的结构问题,找到其离root节点最近的空节点就成了难事。
在参考《算法与数据结构》这本书中的树的全序遍历中,我找到了一些思路,可将二叉树的链式存储暂时转换为顺序存储,因此,能够很容易地找到离root节点最近的空节点,跟其父节点。
参考代码如下:
pTree FindEmptyNode(pTree node, int* flag)//从左到右查找离root最近的空节点的父节点
{
int TreePath = getTreePath(node); //getTreePath(pTree)函数为获得树的层数
int MaxNum = Power2(TreePath) - 1; //获得该树最大存储节点个数,power2函数是我自己写的一个2的次方函数
pTree tree[MAX_SIZE];
tree[0] = node;
int i = 1, j = 1, a = 0; //i表示层数,j表示压入的个数,a表示需要压入子节点的节点
while (i != TreePath+1) //使用该while循环将链式存储转换为顺序存储
{
for (int k = 0; k < Power2(i - 1); k++) //k表示在i层的第k个节点
{
if (tree[a] == NULL)
tree[j++] = NULL;
else if(tree[a]->plchild == NULL)
tree[a]->plchild == NULL;
else if (tree[a]->plchild != NULL)
tree[j++] = tree[a]->plchild;
if (tree[a] == NULL)
tree[j++] = NULL;
else if(tree[a]->prchild == NULL)
tree[j++] = NULL;
else if (tree[a]->prchild != NULL)
tree[j++] = tree[a]->prchild;
a++;
}
i++;
}
i = 0;
for (i = 0; i < MAX_SIZE; i++)
if (tree[i] == NULL)
break;
if (i % 2 == 1) //空节点为奇数的话设置为左节点
*flag = 0;
else
*flag = 1; //空节点为偶数的话设置为右节点
i = (i - 1) >> 1; //通过for循环找到的是空节点,需要通过i = (i - 1) >> 1找到其父节点,然后返回
return tree[i];
}