我有一个平衡的二叉树结构:
深度为0
的节点0
是根。
根的左子是1
,右子是2
,依此类推。
树的总深度为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算法来找出每个节点的这些数据结构值。
答案 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是左孩子
我想剩下的事情很简单