2013-10-15 104 views
0

我想了解一棵n-tree樹的前序遍歷。 我一直在閱讀,我發現的所有例子都使用左子樹和右子樹,但是在n元樹中,左邊是什麼,右邊的子樹是什麼? 有人可以給出一個很好的解釋或僞代碼嗎?遍歷一棵n-tree樹

+1

先查找寬度先或深度先搜索 – aaronman

回答

2

而是在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 

是否幫助你嗎?

+1

是的!那麼,基本上這麼稱呼根權的每個孩子的遍歷函數? – user2775084

+0

@ user2775084:的確如此:) – Davidann

0

這是我的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; 
}