#include<iostream>
#include<queue>
#include<stack>
using namespace std;
template<class T>
class BiTreeNode {
public:
T data;
BiTreeNode* leftNode;
BiTreeNode* rightNode;
BiTreeNode() {
leftNode = NULL;
rightNode = NULL;
}
BiTreeNode(T data) {
this->data = data;
leftNode = NULL;
rightNode = NULL;
}
BiTreeNode(T data, BiTreeNode* leftNode, BiTreeNode* rightNode) {
this->data = data;
this->leftNode = leftNode;
this->rightNode = rightNode;
}
BiTreeNode(const BiTreeNode& node) {
this->data = node.data;
this->leftNode = new BiTreeNode();
this->rightNode = new BiTreeNode();
this->leftNode = node.leftNode;
this->rightNode = node.rightNode;
}
};
template<class T>
class BiTree {
public:
BiTreeNode<T>* root;
int size;
BiTree() {
this->root = NULL;
}
BiTree(const BiTree& biTree) {
this->root = new BiTreeNode();
this->size = biTree.size;
}
//将node节点添加到指定节点的左孩子
void addAtLeft(BiTreeNode<T>* node, BiTreeNode<T>* addNode) {
addNode->leftNode = node->leftNode;
node->leftNode = addNode;
this->size++;
}
//将node节点添加到指定节点的右孩子
void addAtRight(BiTreeNode<T>* node, BiTreeNode<T>* addNode) {
addNode->leftNode = node->rightNode;
node->rightNode = addNode;
this->size++;
}
void levelScan() {
queue < BiTreeNode<int>*> q;
q.push(this->root);
BiTreeNode<int>* node;
while (!q.empty()) {
node = q.front();
if (node->leftNode != NULL) {
q.push(node->leftNode);
}
if (node->rightNode != NULL) {
q.push(node->rightNode);
}
cout << node->data << endl;
q.pop();
}}
void PreScan() {
stack<BiTreeNode<int>*> sp;
BiTreeNode<int>* node = this->root;
sp.push(node);
while (!sp.empty()) {
node = sp.top();
cout << node->data << endl;
sp.pop();
if (node->rightNode != NULL) {
sp.push(node->rightNode);
}
if (node->leftNode != NULL) {
sp.push(node->leftNode);
}
}
}
void midScan() {
stack<BiTreeNode<int>*> sp;
BiTreeNode<int>* node = this->root;
while (node != NULL || !sp.empty()) {
if (node != NULL) {
sp.push(node);
node = node->leftNode;
}
else {
node = sp.top();
sp.pop();
cout << node->data << endl;
node = node->rightNode;
}
}
}
void posScan() {
stack<BiTreeNode<int>*> s1;
stack<BiTreeNode<int>*> s2;
BiTreeNode<int>* node = this->root;
s1.push(node);
while (!s1.empty()) {
node = s1.top();
s1.pop();
s2.push(node);
if (node->leftNode != NULL) {
s1.push(node->leftNode);
}
if (node->rightNode != NULL) {
s1.push(node->rightNode);
}
}
while (!s2.empty()) {
cout << s2.top()->data << endl;
s2.pop();
}
}
};
int main() {
BiTreeNode<int> root(0);
BiTree<int> tree;
tree.root = &root;
BiTreeNode<int> l1(1);
BiTreeNode<int> l2(2);
BiTreeNode<int> l3(3);
BiTreeNode<int> l4(4);
BiTreeNode<int> l5(5);
BiTreeNode<int> l6(6);
tree.addAtLeft(tree.root, &l1);
tree.addAtRight(tree.root, &l2);
tree.addAtLeft(tree.root->leftNode, &l3);
tree.addAtRight(tree.root->leftNode, &l4);
tree.addAtLeft(tree.root->rightNode, &l5);
tree.addAtRight(tree.root->rightNode, &l6);
tree.posScan();
return 0;
}
c++二叉树前序中序后序非递归遍历
最新推荐文章于 2021-06-11 22:59:49 发布
本文介绍了如何使用C++模板类实现二叉树的四种遍历方式:levelScan(层序遍历)、preScan(前序遍历)、midScan(中序遍历)和posScan(后序遍历)。通过实例展示了如何构造二叉树并调用这些遍历方法来展示节点数据。
摘要由CSDN通过智能技术生成