有没有有效的方法来填充平衡的树结构

时间:2018-11-17 09:12:55

标签: c++ algorithm tree binary-tree

我有一个平衡的二叉树结构:

深度为0的节点0是根。 根的左子是1,右子是2,依此类推。

请查看图片:enter image description here

树的总深度为N。此N是问题的唯一参数。级别为N的节点被指定为叶节点。

我正在使用以下节点结构存储此树。

struct node_s{
    int n, depth, parent;//n is node number
    int nodescendents;//number of descendents of the current node
    std::vector<int> descendents;//Descendents in ascending order
    int lchild, rchild;//Immediate left child and right child
    std::vector<int> lchildleaves;//leaf nodes that descend from the immediate 
                                                      //left child
    std::vector<int> rchildleaves;//leaf nodes that descend from the immediate 
                                                      //right child
};

我打算将树本身存储为:

std::vector<node_s> tree;

有没有一种方法可以使用简单的代数大致数字地填充tree向量:

//Creating the nth node, beginning from 0th node, then 1st node and so on
nodes_s node;
//populate all data structures of the nth node
//precisely, here, there are loops, algebraic calculations, etc., that can help 
//populate all of the node_s data members.
tree.push_back(node);

到目前为止,我唯一能想到的方法是显式构造一个图并运行某种Dijkstra算法来找出每个节点的这些数据结构值。

1 个答案:

答案 0 :(得分:1)

对于节点Could not determine join condition between parent/child tables on relationship User.favorite_spots ,关键点是确定其在图形中的位置,以便确定其父级(如果是左或右子级)。

对于节点k,其秩r [k]等于floor(log2(k + 1)),并且其在秩中的位置等于p [k] = k-2 ^ r [k] + 1 < / p>

然后k由(r [k],p [k])对定位

相反,k = 2 ^ r [k] + p [k]-1

然后通过(r [k] -1,floor(p [k] / 2))定位其父节点->节点索引= 2 ^ r + p-1

如果k%2 == 1,则k是左孩子

我想剩下的事情很简单