您的位置:首页 > 其它

广度遍历二叉树和深度遍历二叉树算法

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();
}


总结一下,至少对于命令式编程来说,思考问题的时候要从计算机的角度,而不是直观的认识看问题,才能发现要解决的问题的实质。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: