二叉樹的三種遍歷方式:
typedef struct Node
{
int value;
struct Node* left;
struct Node* right;
}node_t;
1. 前序遍歷(根--左--右)
//遞歸遍歷
void preOrderTraverse(node_t* p)
{
if(p != NULL)
{
cout << p->value;
preOrderTraverse(p->left);
preOrderTraverse(p->right);
}
}
//非遞歸遍歷
void preOrderTraverse(node_t* p)
{
stack<node_t *> s;
initStack(s);
s.push(p);
node_t* tmp = NULL;
while(!s.empty())
{
tmp = s.pop();
while(tmp != NULL)
{
cout << tmp->value;
if(tmp->right)
s.push(tmp->right);
tmp = tmp->left;
}
}
}
2. 中序遍歷(左--根--右)
//遞歸遍歷
void inOrderTraverse(node_t* p)
{
if(p != NULL)
{
inOrderTraverse(p->left);
cout << p->value;
inOrderTraverse(p->right);
}
}
//非遞歸遍歷void inOrderTraverse(node_t* p)
{
stack<node_t*> s;
initStack(s);
node_t* tmp = p;
while(tmp || !s.empty())
{
while(tmp)
{
s.push(p);
p = p->left;
}
tmp = s.pop();
cout << tmp->value;
tmp = tmp->right;
}
}
3. 后序遍歷(左--右--根)
//遞歸遍歷
void postOrderTraverse(node_t* p)
{
if(p)
{
postOrderTraverse(p->left);
postOrderTraverse(p->right);
cout << p->value;
}
}
//非遞歸遍歷
void postOrderTraverse(node_t* p)
{
node_t* tmp = p;
node_t* q = NULL;
stack<node_t*> s;
initStack(s);
while(tmp || !s.empty())
{
while(tmp)
{
s.push(tmp);
if(tmp->left)
tmp = tmp->left;
else
tmp = tmp->right;
}
if(s.empty())
break;
q = s.top();
if(q->right == tmp)
{
tmp = s.pop();
cout << tmp->value;
}
else
{
tmp = q->right;
}
}
}
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。