N叉树的广度优先遍历和深度优先遍历

class Node {

public:

int val;

vector<Node*> children;

};

// N 叉树的非递归层序遍历(广度优先遍历)

void levelOrderTraverse(Node* root) {

if (root == nullptr) {

return;

}

std::queue<Node*> q;

q.push(root);

while (!q.empty()) {

Node* cur = q.front();

q.pop();

// 访问 cur 节点

std::cout << cur->val << std::endl;

// 把 cur 的所有子节点加入队列

for (Node* child : cur->children) {

q.push(child);

}

}

}

// N 叉树的递归先序遍历(深度优先遍历)

void Preorder(Node* root){

// 先序遍历

if(nullptr == root) return;

// 访问当前节点

cout << root->data << endl;

// 访问子节点

for(auto node:root->children){

Preorder(node);

}

}

// N 叉树的非递归先序遍历(深度优先遍历)

void preorder_stack(node* root){

if(nullptr == root) return;

stack<node*> s;

s.push(root);

while(!s.empty()){

node* node = s.top();

s.pop();

cout << node->data << " ";

for(int i=node->children.size()-1; i>=0; i--){

s.push(node->children[i]);

}

}

}

// N 叉树的递归后序遍历(深度优先遍历)

void Postorder(Node* root){

// 先序遍历

if(nullptr == root) return;

// 访问子节点

for(auto node:root->children){

Postorder(node);

}

// 访问当前节点

cout << root->data << endl;

}

// N 叉树的非递归后序遍历(深度优先遍历)

void Postorder_stack(Node* root){

if(nullptr == root) return;

stack<Node*> s;

s.push(root);

Node* pre = root;

while(!s.empty()){

Node* node = s.top();

if(node->children.empty() // 叶子结点

|| pre == node->children.back() // 分支节点的叶子节点完>成访问

){

s.pop();

cout << node->data << " ";

}else{

for(int i=node->children.size()-1; i>=0; i--){

s.push(node->children[i]);

}

}

pre = node;

}

}

// N 叉树的非递归层序遍历(广度优先遍历)

int depth(Node* root) {

if(nullptr == root) return 0;

int maxdepth = 0;

for(auto child : root->children){

maxdepth = max(maxdepth, depth(child));

}

return maxdepth+1;

}

void traverLayer(Node* root, int level){

if(nullptr == root) return;

if(level == 0){

cout << root->data << " ";

}else{

for(auto child:root->children){

traverLayer(child,level-1);

}

}

}

void BFS2(Node* root){

if(nullptr == root) return;

int n=depth(root);

for(int i=0; i<n; i++){

traverLayer(root, i);

}

}

全部评论

相关推荐

Webpack通过解析入口文件及其所依赖的其他模块,构建一个完整的依赖图,从而理清模块之间的依赖关系。具体的处理方式包括以下几个方面:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;uuid=ba06d8fbb87f45f7bf340c85dc4f0cc1模块解析:Webpack会根据配置的解析规则,解析模块的路径和文件类型。默认情况下,Webpack会按照特定的路径搜索规则来查找模块,可以通过配置文件指定更多的解析选项。Webpack支持解析各种类型的文件,如JavaScript、CSS、图片等,以及一些特殊的模块类型,如命名的&nbsp;AMD&nbsp;或&nbsp;CommonJS&nbsp;模块。加载器处理:Webpack在解析模块时,会根据模块的类型,使用相应的加载器来对模块进行预处理。加载器可以将模块进行编译、转译、压缩等操作。加载器可以串联使用,以处理多个模块,形成一个处理管道。其中,每个加载器负责对模块进行特定的处理,然后将处理结果传递给下一个加载器,直至最终的模块打包。依赖收集:在解析模块的过程中,Webpack会分析模块之间的依赖关系,并将这些依赖关系记录在依赖图中。通过静态分析的方式,Webpack可以在编译时就知道每个模块所依赖的其他模块,以及被哪些模块所引用。模块打包:依赖图中的模块经过加载器处理后,Webpack将根据配置使用优化策略来打包模块。例如,可以将多个模块的公共代码抽取出来,形成单独的代码块,以减少重复的代码。还可以进行代码分割,将不同功能或路由的代码分割成多个文件,以实现按需加载。通过以上的处理方式,Webpack能够准确地处理模块之间的依赖关系,构建出一个完整的依赖图,并最终将模块打包成一个或多个静态文件。这样,在浏览器中加载这些文件时,模块的依赖关系也会得到正确的处理。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
2 1 评论
分享
牛客网
牛客企业服务