【问题标题】:Traverse a n-ary tree遍历 n 叉树
【发布时间】:2014-11-04 15:09:04
【问题描述】:

我正在尝试了解 n 叉树的前序遍历。 我一直在阅读,我发现的所有示例都使用左子树和右子树,但是在 n 叉树中,左子树是什么,右子树是什么? 有人可以给出一个很好的解释或伪代码吗?

【问题讨论】:

  • 查找广度优先或深度优先搜索

标签: c++ tree traversal


【解决方案1】:

而不是考虑leftright 的细节,如:

def preorder_traversal(tree)
   preorder_traversal(tree->left)
   preorder_traversal(tree->right)
end

如果相反,您将其视为分支:

def preorder_traversal(tree)
   branches = tree->branches // e.g. [left, middle, next-to-right, right]
   branches.each do |branch|
     preorder_traversal(branch)
   end
end

这对你有帮助吗?

【讨论】:

  • 是的!那么,基本上这样调用根的每个孩子的遍历函数对吗?
  • @user2775084:完全正确:)
【解决方案2】:

这是我的 C++ 实现,用于 n 维树的级别顺序遍历。您可以对前序遍历进行一些调整。假设一个节点最多可以有 50 个分支,但您始终可以修改该部分。希望这会有所帮助如果您发现任何错误,请告诉我。 谢谢!

#include <iostream>
#include <map>
#include <vector>
using namespace std;
#define MAXSIZE 50

typedef struct node{
    int data;
    node** bArray;
} Node;


Node* newNode(int data){
    Node* newnode = new Node;
    newnode->data = data;
    newnode->bArray = new Node* [MAXSIZE];
    for(int i=0;i<50;i++){
        newnode->bArray[i] = NULL;
    }
    return newnode;
}

void mapFun(Node* root,int level,map<int,vector<int> >&m){
    if(root == NULL)return;
    m[level].push_back(root->data);

    for(int i=0;i<MAXSIZE;i++)
        mapFun(root->bArray[i],level+1,m);

    return;
}

void print_level(map<int,vector<int> >&m, int level){
    cout<<level<<"th level traversal is........";
    vector<int> v = m[level];
    vector<int>::iterator it;
    for(it=v.begin();it!=v.end();it++){
        cout<<*it<<" ";
    }

}

void levelOrder(Node* root, map<int,vector<int> >&m){
    mapFun(root,1,m);
    int mapsize = m.size();
    for(int i=1;i<=mapsize;i++){
        print_level(m,i);
        cout<<endl;
    }
}

int main(){
    int i;
    map<int,vector<int> >mymap;
    map<int,vector<int> > :: iterator it;
    Node *root = newNode(1);
    root->bArray[0] = newNode(2);
    root->bArray[1] = newNode(3);
    root->bArray[2] = newNode(4);
    Node* first = root->bArray[1];
    first->bArray[0] = newNode(8);
    first->bArray[1] = newNode(9);
    first->bArray[2] = newNode(10);
    Node *second = first->bArray[1];
    second->bArray[0] = newNode(55);
    second->bArray[1] = newNode(65);
    second->bArray[2] = newNode(75);
    cout << "level order traversal is \n";
    levelOrder(root,mymap);
    return 0;
}

【讨论】:

    猜你喜欢
    • 2021-03-03
    • 2020-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2012-01-01
    • 2015-05-09
    • 1970-01-01
    相关资源
    最近更新 更多