【发布时间】:2014-07-05 17:08:44
【问题描述】:
我一直在从事这个项目作为一种兴趣,并不断回来......
我正在尝试创建的是一种算法来枚举斐波那契值的二叉树的值集:
我用来打印这棵树的排列的算法:
- 打印根值(结果:([root 0]=5))
- 下降到左孩子 [left 1]
- 打印新的左节点 [left 1] 和右兄弟节点值(结果:([left 1] 3,[right 1] 2))
- 如果右兄弟节点 [right 1] 有子节点,遍历这个右节点 [right 1],枚举它的值,连同它的兄弟左节点 [left 1](结果:[left 1] 3,[left 3] 1,[右 3] 1)
- 下降到左孩子 [左 2],作为第 2 步
- 打印新的左节点值[left 2] 2,以及共同左父节点[left 1]的右兄弟节点值[right 2] 1;同时遍历和枚举根的每一级右节点的结果。因此,在 about 树示例中,枚举结果将是,遍历树以获得排列: ([left 2] 2,[right 2] 1,[right 1] 2),([left 2] 2,[right 2] 1, [左 3] 1, [右 3] 1))
- 没有左孩子可以堕落,所以停止
每组应加起来为根的值。我认为我尝试描述算法中每个步骤的方法可能并不完全清楚 - 任何关于在算法中写出步骤的最佳实践的帮助对我也很有用。
我在这里期望的结果,枚举上面的树将是:
([root 0] 5),([left 1] 3, [right 1] 2),([left 1] 3, [left 3] 1, [right 3] 1),([left 2] 2, [右 2] 1, [右 1] 2),([左 2] 2,[右 2] 1, [左 3] 1, [右 3] 1)
我想采用递归方法,并将其作为一种方法合并到我创建的用于构建树的二进制结构类中。所以这不是关于构建树结构,而是按照上面的方法遍历它,或者产生相同结果的方法。
谁能进一步帮助我?任何帮助将不胜感激。
在我的 `FibTree` `Class` 中添加集合打印方法:
FibTree 头文件(代码 sn-ps):
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 文件(代码 sn-ps):
// 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: 请求'* nodeIterator 中的成员'data'。 __gnu_cxx::__normal_iterator<_iterator _container>::operator-> with _Iterator = const FibTree::Node**, Container = std::vector >',属于非类类型'const FibTree::Node *'
任何帮助追踪此错误将不胜感激!
【问题讨论】:
-
把第6步解释清楚。
-
@nikhil_vyas 我已经为我要解决的问题增加了一些清晰度。我不是专业程序员,因此您可能必须将任何建议的方法分解为可理解的块。非常感谢亚历克斯
-
我已经编辑了我的答案,包括制作套装。
-
您不能递归地遍历节点并按照您描述的顺序输出节点。您可以做的是分两次执行遍历。使用地图等标准容器有什么限制吗?
-
我认为您的树还没有完成,或者您计划根据算法添加某种额外的遍历搜索(Left2 必须有 2 个以上的孩子 [left 4] 1, [right 4] 1),如果那是正确的,那么我想我可能会为您提供答案
标签: c++ data-structures binary-tree combinatorics fibonacci