Chinaunix
标题:
二叉树的递归与非递归遍历
[打印本页]
作者:
ypxing
时间:
2007-11-16 10:58
标题:
二叉树的递归与非递归遍历
看了版主converse写的二叉树的递归与非递归遍历
http://www.cppblog.com/converse/archive/2006/07/08/9577.html
其中, 版主写到:
"感觉其中后序遍历的非递归算法比较困难,想了很久最后的实现还是不够优雅"
俺也写了一个玩玩, 功能一样, 但是思路不一样, 呵呵
#include <iostream>
#include <stack>
#include <cassert>
using namespace std;
struct node
{
node* lchild;
node* rchild;
int key;
node(int data=0, node* left=NULL, node* right=NULL)
{
key = data;
lchild = left;
rchild = right;
}
};
class Tree
{
public:
Tree()
{
root = NULL;
}
Tree(int array[], int size);
~Tree();
void traverse();
void postTraverse();
void recur_postTraverse(node* cur);
void preTraverse();
void recur_preTraverse(node* cur);
void inTraverse();
void recur_inTraverse(node* cur);
private:
Tree(const Tree& t);
Tree& operator=(const Tree& t);
node* createTree(int array[], int size);
void destroyTree(node* cur);
private:
node* root;
};
Tree::Tree(int array[], int size)
{
if ((array==NULL)||(size<=0))
root = NULL;
else
root = createTree(array, size);
}
node* Tree::createTree(int array[], int size)
{
if ((array==NULL)||(size<=0))
return NULL;
int mid=size/2;
node* cur=new node(array[mid]);
cur->lchild = createTree(array, mid);
cur->rchild = createTree(array+mid+1, size-mid-1);
return cur;
}
Tree::~Tree()
{
destroyTree(root);
}
void Tree::destroyTree(node* cur)
{
if (cur != NULL)
{
destroyTree(cur->lchild);
destroyTree(cur->rchild);
delete cur;
}
}
//后序递归遍历
void Tree::recur_postTraverse(node* cur)
{
if (cur!=NULL)
{
recur_postTraverse(cur->lchild);
recur_postTraverse(cur->rchild);
cout << cur->key << " ";
}
}
//先序递归遍历
void Tree::recur_preTraverse(node* cur)
{
if (cur!=NULL)
{
cout << cur->key << " ";
recur_preTraverse(cur->lchild);
recur_preTraverse(cur->rchild);
}
}
//中序递归遍历
void Tree::recur_inTraverse(node* cur)
{
if (cur!=NULL)
{
recur_inTraverse(cur->lchild);
cout << cur->key << " ";
recur_inTraverse(cur->rchild);
}
}
//后序非递归遍历
void Tree::postTraverse()
{
stack<node*> treeStack;
node *pre, *cur;
cur = root;
pre = NULL;
if (cur!=NULL)
treeStack.push(cur);
while(!treeStack.empty())
{
cur = treeStack.top();
if (((cur->lchild==NULL)&&(cur->rchild==NULL))|| //没有孩子结点或者
((pre!=NULL)&&((pre==cur->lchild)||(pre==cur->rchild)))) //孩子遍历过了
{
treeStack.pop();
cout << cur->key << " ";
pre = cur;
}
else
{
if (cur->rchild!=NULL)
treeStack.push(cur->rchild);
if (cur->lchild!=NULL)
treeStack.push(cur->lchild);
}
}
}
//中序非递归遍历
void Tree::inTraverse()
{
stack<node*> treeStack;
node *pre, *cur;
cur = root;
if (cur!=NULL)
treeStack.push(cur);
while(!treeStack.empty())
{
cur = treeStack.top();
treeStack.pop();
if (cur == NULL)
continue;
if ((cur->lchild==NULL)|| //没有左孩子或者
((!treeStack.empty())&&(treeStack.top()==cur->rchild))) //右孩子已经入过栈
cout << cur->key << " ";
else
{
treeStack.push(cur->rchild);
treeStack.push(cur);
if (cur->lchild!=NULL)
treeStack.push(cur->lchild);
}
}
}
//先序非递归遍历
void Tree::preTraverse()
{
stack<node*> treeStack;
node *pre, *cur;
cur = root;
if (cur!=NULL)
treeStack.push(cur);
while(!treeStack.empty())
{
cur = treeStack.top();
treeStack.pop();
cout << cur->key << " ";
if (cur->rchild!=NULL)
treeStack.push(cur->rchild);
if (cur->lchild!=NULL)
treeStack.push(cur->lchild);
}
}
void Tree::traverse()
{
recur_preTraverse(root);
cout << endl;
preTraverse();
cout << endl << endl;
recur_inTraverse(root);
cout << endl;
inTraverse();
cout << endl << endl;
recur_postTraverse(root);
cout << endl;
postTraverse();
cout << endl << endl;
}
int main(int argc, char* argv[])
{
int array[] = {2, 4, 5, 6, 8, 10, 11, 13, 15, 17, 20};
Tree tr(array, sizeof(array)/sizeof(array[0]));
tr.traverse();
}
复制代码
[
本帖最后由 ypxing 于 2007-11-16 11:22 编辑
]
作者:
converse
时间:
2007-11-16 15:37
没时间好好看看了,做个标记先~~
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2