广度遍历二叉树和深度遍历二叉树算法
2014-03-09 19:48
267 查看
二叉树算法基本和递归有关,前中后序算法就不提了,主要看一下深度优先遍历和广度优先遍历。实现这2种遍历需要借助栈或者队列来保存中间结果,原因是遍历过程出现了回溯。
总结一下,至少对于命令式编程来说,思考问题的时候要从计算机的角度,而不是直观的认识看问题,才能发现要解决的问题的实质。
//笔试题:广度遍历二叉树、深度遍历二叉树 #include<iostream> #include<queue> #include<stack> using namespace std; struct node{ int id; node(int x=0):id(x),left(nullptr),right(nullptr){} void visit(){cout<<id<<' ';} node* left,* right; }; //构造一个二叉树 void buildtree(node* root) { if(root->id > 10) return ; root->left = new node(root->id*2 + 1); root->right = new node(root->id*2 + 2); buildtree(root->left); buildtree(root->right); } //广度优先遍历树 queue<node*> qnode; void breadthFirstVisit(node* root) { if(root!=nullptr) { qnode.push(root->left); qnode.push(root->right); root->visit(); root = qnode.front(); qnode.pop(); breadthFirstVisit(root); } } //深度优先遍历树 stack<node*> snode; void dumpstack() { cout<<"dump:======="<<endl; while(!snode.empty()) { node* t=snode.top(); if(t!=nullptr) t->visit(); snode.pop(); } cout<<endl; } void deepFirstVisit(node* root) { if(root!=nullptr) { snode.push(root->right); snode.push(root->left); root->visit(); root = snode.top(); snode.pop(); deepFirstVisit(root); root = snode.top(); snode.pop(); deepFirstVisit(root); } } int main() { node* tree = new node; buildtree(tree); breadthFirstVisit(tree); cout<<endl; deepFirstVisit(tree); cout<<endl; cin.get(); }
总结一下,至少对于命令式编程来说,思考问题的时候要从计算机的角度,而不是直观的认识看问题,才能发现要解决的问题的实质。
相关文章推荐
- (c++)二叉树的广度优先遍历和深度优先遍历
- 二叉树的构建以及深度优先遍历 广度优先遍历
- 八.二叉树各种操作的C语言实现 深度遍历求深度,广度遍历求深度,交换左右子树,求叶子节点数
- 二叉树的构建、层次打印、广度遍历、深度遍历、K值路径
- 二叉树的递归,非递归遍历,深度优先遍历,广度优先遍历
- 二叉树的深度和广度优先遍历 - Java实现
- 二叉树相关算法——创建、遍历、求深度和广度
- 二叉树的操作 深度广度遍历,二叉树递归和非递归遍历
- 二叉树的深度广度遍历
- 二叉树的深度优先和广度优先遍历
- 构建二叉树、二叉树的深度、广度优先遍历
- 二叉树的深度优先和广度优先遍历
- 二叉树的深度优先和广度优先遍历
- 二叉树的深度优先遍历、广度优先遍历和非递归遍历、图的深度优先和广度优先遍历
- 二叉树的深度优先和广度优先遍历
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- 二叉树的深度优先和广度优先遍历
- 二叉树的深度广度遍历
- 二叉树的深度优先和广度优先遍历
- 第五讲 树-1(广度优先遍历二叉树&深度优先遍历二叉树)