#include <stdio.h>
#include <stdlib.h>
#include <stack>
#include <iostream>
#include <vector>
using namespace std;
struct Node {
int value;
Node *pLChild;
Node *pRChild;
};
void Visit(Node *node) {
printf("%d ", node->value);
}
void InOrderTraverse(Node *root) {
stack<Node*> nStack;
nStack.push(root);
Node* p = new Node();
while(!nStack.empty()) {
p = nStack.top();
if(p) {
while(p->pLChild){
nStack.push(p->pLChild);
p = nStack.top();
}
} else {
nStack.pop();
}
if(!nStack.empty()) {
p = nStack.top();
nStack.pop();
if(p)
Visit(p);
nStack.push(p->pRChild);
}
}
}
void PreOrderTraverse(Node *root) {
stack<Node *> nStack;
nStack.push(root);
Node *p = new Node();
while(!nStack.empty()) {
p = nStack.top();
nStack.pop();
if(p) {
Visit(p);
if(p->pRChild)
nStack.push(p->pRChild);
if(p->pLChild)
nStack.push(p->pLChild);
}
}
}
void PostOrderTraverse(Node *root) {
stack<Node *> nStack;
nStack.push(root);
Node *p = new Node();
vector<bool> bvec;
bvec.push_back(false);
int index = 0;
while(!nStack.empty()) {
p = nStack.top();
if(p->pLChild && p->pRChild && bvec[index] == false) {
nStack.push(p->pRChild);
nStack.push(p->pLChild);
bvec.push_back(false);
bvec.push_back(false);
bvec[index] = true;
index += 2;
}else if(p->pRChild && bvec[index] == false) {
nStack.push(p->pRChild);
bvec.push_back(false);
bvec[index] = true;
++index;
} else if(p->pLChild && bvec[index] == false){
nStack.push(p->pLChild);
bvec.push_back(false);
bvec[index] = true;
++index;
} else {
Visit(p);
--index;
bvec.pop_back();
nStack.pop();
}
}
}
int main() {
Node* a = new Node();
a->value = 1;
Node* a1 = new Node();
a1->value = 2;
Node* a2 = new Node();
a2->value = 3;
Node* a3 = new Node();
a3->value = 11;
Node* a4 = new Node();
a4->value = 4;
Node* a5 = new Node();
a5->value = 5;
a->pLChild = a1;
a->pRChild = a2;
a1->pLChild = a3;
a1->pRChild = a4;
a4->pLChild = a5;
InOrderTraverse(a);
cout << endl;
PreOrderTraverse(a);
cout << endl;
PostOrderTraverse(a);
system("pause");
}
二叉树前序,中序,后序非递归遍历
最新推荐文章于 2023-01-19 14:14:12 发布