我正在进行这个项目的工作,这是我的兴趣所在,并且一直在回来这个项目…… 我试图创建一个算法来枚举斐波那契值的二叉树的值集:算法我将用于打印此树的排列:
1. 打印根节点的值(结果:([root 0]=5)) 2. 下降到左子节点[left 1] 3. 打印新的左节点[left 1]和右兄弟节点的值(结果:([left 1] 3,[right 1] 2)) 4. 如果右兄弟节点[right 1]有子节点,则遍历该右节点[right 1],枚举其值以及其兄弟左节点[left 1](结果:[left 1] 3,[left 3] 1,[right 3] 1) 5. 下降到左子节点[left 2],如第2步 6. 打印公共左父节点[left 1]的新左节点值[left 2] 2和右兄弟节点值[right 2] 1;同时遍历并枚举根节点的每个级别的右节点的结果。因此,在上述树示例中,遍历树以获取排列的枚举结果为:([left 2] 2,[right 2] 1,[right 1] 2),([left 2] 2,[right 2] 1,[left 3] 1,[right 3] 1)) 7. 没有左子节点可下降,因此停止
每个集合的值应该加起来等于根节点的值。我认为我尝试描述算法中的每个步骤的方法可能不是完全清晰的 - 对于编写算法步骤的最佳实践的任何帮助对我也很有用。
我期望的结果是,枚举上面的树将是:([root 0] 5),([left 1] 3,[right 1] 2),([left 1] 3,[left 3] 1,[right 3] 1),([left 2] 2,[right 2] 1,[right 1] 2),([left 2] 2,[right 2] 1,[left 3] 1,[right 3] 1)
我想采用递归方法,并将其作为方法并入我创建的二进制结构的类中。所以这不是关于构建树结构,而是按照上述方法遍历它,或者产生相同的结果的方法。
有谁能帮我进一步?任何帮助都将不胜感激。
向我的`FibTree Class`添加集合打印方法:
我在`void FibTree::writeSets`中的`std::cout << *nodeIterator->data;`处遇到编译错误,错误提示为:
1. 打印根节点的值(结果:([root 0]=5)) 2. 下降到左子节点[left 1] 3. 打印新的左节点[left 1]和右兄弟节点的值(结果:([left 1] 3,[right 1] 2)) 4. 如果右兄弟节点[right 1]有子节点,则遍历该右节点[right 1],枚举其值以及其兄弟左节点[left 1](结果:[left 1] 3,[left 3] 1,[right 3] 1) 5. 下降到左子节点[left 2],如第2步 6. 打印公共左父节点[left 1]的新左节点值[left 2] 2和右兄弟节点值[right 2] 1;同时遍历并枚举根节点的每个级别的右节点的结果。因此,在上述树示例中,遍历树以获取排列的枚举结果为:([left 2] 2,[right 2] 1,[right 1] 2),([left 2] 2,[right 2] 1,[left 3] 1,[right 3] 1)) 7. 没有左子节点可下降,因此停止
每个集合的值应该加起来等于根节点的值。我认为我尝试描述算法中的每个步骤的方法可能不是完全清晰的 - 对于编写算法步骤的最佳实践的任何帮助对我也很有用。
我期望的结果是,枚举上面的树将是:([root 0] 5),([left 1] 3,[right 1] 2),([left 1] 3,[left 3] 1,[right 3] 1),([left 2] 2,[right 2] 1,[right 1] 2),([left 2] 2,[right 2] 1,[left 3] 1,[right 3] 1)
我想采用递归方法,并将其作为方法并入我创建的二进制结构的类中。所以这不是关于构建树结构,而是按照上述方法遍历它,或者产生相同的结果的方法。
有谁能帮我进一步?任何帮助都将不胜感激。
向我的`FibTree Class`添加集合打印方法:
FibTree头文件(代码片段):
class FibTree {
public:
class Node {
public:
int data;
Node const* left;
Node const* right;
Node const* parent;
int n;
int level;
int index;
Node (void);
};
Node const* root; // 'root' pointer to constant Node
FibTree (int);
Node const* getRoot(void);
void startWriteSets(Node const* root); // Write all sets of tree
private:
static Node* buildTree( int n, int level = 0, int i = 1, Node* parent = NULL );
// Used by startWriteSets
void writeSets(std::vector<Node const*> &setsList, Node const* cur);
FibTree CPP文件(代码片段):
// FibTree Constructor
FibTree::FibTree(int n) {
this->root = buildTree( n );
};
// Getters
FibTree::Node const* FibTree::getRoot(void) {
return this->root;
}
// Write sets of tree
void FibTree::startWriteSets(Node const* root) {
std::vector<Node const*> setsList;
std::cout << root->data;
writeSets(setsList, root);
}
// Private FibTree methods
FibTree::Node* FibTree::buildTree( int n, int level, int i, Node* parent ) { // Build Tree structure
Node* thisNode = new Node();
thisNode->n = n;
thisNode->level = level;
thisNode->index = i;
thisNode->parent = parent;
if (n < 2) {
thisNode->left = NULL;
thisNode->right = NULL;
thisNode->data = n;
return thisNode;
} else {
thisNode->left = buildTree( n - 1 , level + 1, i*2, thisNode );
thisNode->right = buildTree( n - 2, level + 1, i*2+1, thisNode );
thisNode->data = thisNode->left->data + thisNode->right->data;
return thisNode;
}
}
void FibTree::writeSets(std::vector<Node const*> &setsList, Node const* cur) {
std::vector<Node const*>::iterator nodeIterator;
// Displays all preceding left values
for (nodeIterator = setsList.begin();
nodeIterator != setsList.end(); nodeIterator++) {
std::cout << *nodeIterator->data;
}
std::cout << cur->left->data;
std::cout << cur->right->data;
setsList.push_back(cur->left);
writeSets(setsList,cur->right);
setsList.pop_back();
}
// FibTree Node constructor
FibTree::Node::Node()
: data( 0 ),
left( NULL ),
right( NULL ),
parent( NULL ),
n( 0 ),
level( 0 ),
index( 0 )
{
};
我在`void FibTree::writeSets`中的`std::cout << *nodeIterator->data;`处遇到编译错误,错误提示为:
_error: request for member 'data' in '* nodeIterator. __gnu_cxx::__normal_iterator<_Iterator, _Container>::operator-> with _Iterator = const FibTree::Node**, Container = std::vector >', which is of non-class type 'const FibTree::Node*'。请帮我查找此错误,谢谢!