1.广度优先
struct Node
{
int data;
Node* left;
Node* right;
};
void BreadthFirstSearch(Node* pTree)
{
if (pTree == nullptr)
return;
queue<Node*>queueNode;
queueNode.push(pTree);
Node* pNode;
while (!queueNode.empty())
{
pNode = queueNode.front;
queueNode.pop();
std::cout << pNode->data << std::endl;
if (pNode->left != nullptr)
queueNode.push(pNode->left);
if (pNode->right != nullptr)
queueNode.push(pNode->right);
}
}
2.深度优先
struct Node
{
int data;
Node* left;
Node* right;
};
void DepthFirstSearch(Node* pTree)
{
if (pTree == nullptr)
return;
stack<Node*>stackNode;
stackNode.push(pTree);
Node* pNode;
while (!stackNode.empty())
{
pNode = stackNode.top();
std::cout << pNode->data << std::endl;
stackNode.pop();
if (pNode->right != nullptr)
stackNode.push(pNode->right);
if (pNode->left != nullptr)
stackNode.push(pNode->left);
}
}
3.遍历(先/中/后序)
3.1递归
struct Node
{
int data;
Node* left;
Node* right;
};
#include <iostream>
#include <stack>
void Traversal(Node* pHead)
{
if (pHead == nullptr)
return;
std::cout << pHead->data << std::endl;
Traversal(pHead->left);
Traversal(pHead->right);
Traversal(pHead->left);
std::cout << pHead->data << std::endl;
Traversal(pHead->right);
Traversal(pHead->left);
Traversal(pHead->right);
std::cout << pHead->data << std::endl;
}
3.2非递归
struct Node
{
int data;
Node* left;
Node* right;
};
#include <iostream>
#include <stack>
void TraversalPre(Node* pHead)
{
if (pHead == nullptr)
return;
std::stack<Node*>stackNode;
stackNode.push(pHead);
Node* pNode = pHead;
while (!stackNode.empty())
{
pNode = stackNode.top();
std::cout << pNode->data << std::endl;
stackNode.pop();
if (pNode->right != nullptr)
stackNode.push(pNode->right);
if (pNode->left != nullptr)
stackNode.push(pNode->left);
}
}
void TraversalIn(Node* pHead)
{
if (pHead == nullptr)
return;
std::stack<Node*>stackNode;
while (!stackNode.empty() || pHead != nullptr)
{
if (pHead != nullptr)
{
stackNode.push(pHead);
pHead = pHead->left;
}
else
{
pHead = stackNode.top();
std::cout << pHead->data << std::endl;
stackNode.pop();
pHead = pHead->right;
}
}
}
void TraversalPos(Node* pHead)
{
if (pHead == nullptr)
return;
std::stack<Node*>stackNode1;
std::stack<Node*>stackNode2;
Node* pNode;
stackNode1.push(pHead);
while (!stackNode1.empty())
{
pNode = stackNode1.top();
stackNode2.push(pNode);
stackNode1.pop();
if (pNode->left != nullptr)
stackNode1.push(pNode->left);
if (pNode->right != nullptr)
stackNode1.push(pNode->right);
}
while (!stackNode2.empty())
{
std::cout << stackNode2.top()->data << std::endl;
stackNode2.pop();
}
}