c – 二叉树遍历以枚举Fibonacci值的所有排列

作为一个兴趣,我正在进行这个项目的工作,并继续回到它…

我想要创建的是一个枚举Fibonacci值二叉树值集的算法:

我用来打印这棵树的排列的算法:

>打印根值(结果:([root 0] = 5))
>下降到左边的孩子[左1]
>打印新左节点[左1]和右兄弟节点值(结果:([左1] 3,[右1] 2))
>如果右兄弟节点[右1],有子节点,遍历这个右节点[右1],枚举它的值,以及它的兄弟左节点[左1](结果:[左1] 3,[左3] 1,[右3] 1)
>下降到左边的孩子[左2],如第2步
>打印新左侧节点值[左侧2] 2,右侧共同左侧父节点右侧[右侧2] 1 [左侧1];同时遍历和枚举根的每个级别的右边节点的结果.因此在约束树示例中,枚举结果将遍历树以获得排列:([left 2] 2,[right 2] 1,[right 1] 2),([left 2] 2,[right] 2] 1,[左3] 1,[右3] 1))
>没有留下的孩子,所以停下来

每个集合应该加起来为root的值.我认为我尝试描述算法中每个步骤的方法可能并不完全清楚 – 对于在算法中写出步骤的最佳实践的任何帮助对我来说也是有用的.

我在这里期望的结果,枚举上面的树将是:

([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)

我想采用递归方法并将作为一种方法合并到我创建的构建树的二进制结构类中.所以这不是建立树结构,而是按照上面的方法遍历它,或者产生相同结果的方法.

任何人都可以帮助我吗?任何帮助将非常感激.

将set打印方法添加到我的`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 )
{
};

我在std :: cout<

_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*’

任何帮助追踪此错误将不胜感激!

最佳答案 你在这里遇到的问题不是你需要遍历B树.这是相当直接的.你遇到的问题是你需要跟踪方程的另一半的状态. Aka,当你进入右链的第二层时,你仍然需要知道[左1] = 3.

对此的可能解决方案是跟踪向量(或其他构造)中的左节点.以便….

void start(void) {
  vector<NODE*> list;
  cout << head->val;
  visit(list, head);
}

void visit(vector<NODE*> &list, NODE *cur) {
  // Displays all preceding left values.
  for (vector<NODE*> it = list.begin(); it != list.end(); it++) {
    cout << *it->val;
  }
  cout << cur->left->val;
  cout << cur->right->val;

  list.push_back(cur->left);
  visit(list, cur->right);
  list.pop_back();
}

这会在正确的方向上为您提供所需的信息.你需要添加适当的安全检查和其他方向,但它应该让你去.

点赞