您的位置:首页 > 其它

二叉树三种遍历算法递归和非递归实现

2016-02-28 10:49 639 查看
//二叉树 三种遍历方式的 递归非递归实现

#include

#include

using namespace std;

typedef struct BiTreeNode

{

int data;

BiTreeNode *left;

BiTreeNode *right;

BiTreeNode()

{

left = NULL;

right =NULL;

}

}BitTreeNode,*LinkBiTree;

//--------------------先序

void preTraverse( LinkBiTree root) //先序--非递归

{

if(root == NULL)

return ;

BiTreeNode *p = root;

stack stNode;

while( p!=NULL || !stNode.empty() )

{

while(p != NULL)

{

cout << p->data << " ";

stNode.push(p);//将每一个遍历的节点入栈,用于遍历右孩子

p=p->left;

}

p=stNode.top();//取栈顶元素

stNode.pop();//出栈

p = p->right;

}

}

void preTraverse2(LinkBiTree root) //先序--递归

{

if(root == NULL)

return;

BiTreeNode *p = root;

cout << p->data << " ";

preTraverse2(p->left);

preTraverse2(p->right);

}

//------中序

void MidTraverse( LinkBiTree root) //中序--非递归

{

if(root == NULL)

return;

BiTreeNode *p=root;

stack stNode;

while( p!= NULL || !stNode.empty() )

{

while(p!=NULL)

{

stNode.push(p);//从根节点到最左边叶子节点入栈

p=p->left;

}

p =stNode.top();//取栈顶元素

cout << p->data << " ";

stNode.pop();//出栈

p=p->right;

}

}

void MidTraverse2(LinkBiTree root) //中序--递归

{

if(root == NULL)

return;

BiTreeNode *p = root;

MidTraverse2(p->left);

cout << p->data << " ";

MidTraverse2(p->right);

}

void postTraverse( LinkBiTree root)//后序 非递归

{

if(root == NULL)

return;

stack stNode;

BiTreeNode *p = root;

BiTreeNode *pre = NULL;//记录上次出栈的节点,若是当前节点的右孩子,当前节点出栈,若不是,将当 前节点的右孩子入栈

while(p!=NULL || !stNode.empty())

{

while(p!=NULL)//从根节点开始到最左边叶子节点入栈

{

stNode.push(p);

p=p->left;

}

p=stNode.top();

if(p->right!= NULL && p->right != pre)//存在右孩子,并且有孩子没有入栈(还没访问过)

{

p=p->right;

}

else

{

cout << p->data << " ";

pre = stNode.top(); //记录本次出栈的元素

stNode.pop();

p=NULL;//防止再次入栈

}

}

}

void postTraverse2(LinkBiTree root)//后序-递归

{

if(root == NULL)

return ;

BiTreeNode *p = root;

postTraverse2(p->left);

postTraverse2(p->right);

cout << p->data << " ";

}

int main()

{

BiTreeNode *node = new BiTreeNode[5];

BiTreeNode *root = node;

root->left = &node[1];

root->right = &node[2];

node[1].right = &node[3];

node[3].left = &node[4];

for(int i=0;i!=5;++i)

node[i].data = i;

preTraverse(root);

preTraverse2(root);

cout <<endl;

MidTraverse(root);

MidTraverse2(root);

cout <<endl;

postTraverse(root);

postTraverse2(root);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: