二叉树之链式存储转换为顺序存储

在二叉树中,由于不同的需求,不同的人对数据的插入可能不同。

在此由于刚开始学习树的插入,在不考虑树的排序的情况下,想对树进行插入操作,但是由于树的结构问题,找到其离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表示需要压入子节点的节点

扫描二维码关注公众号,回复: 3050870 查看本文章

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];

}

猜你喜欢

转载自blog.csdn.net/qq_38107043/article/details/80204078