各项遍历大致思路:
深度优先遍历:采用栈(后进先出)
广度优先遍历:采用队列(先进先出)
前序遍历:根——左子树——右子树
中序遍历:左子树——根——右子树
后序遍历:左子树——右子树——根
不详细叙述二叉树各个遍历的原理,直接上代码:
#include<iostream>
#include<algorithm>
#include <queue>
#include <stack>
using namespace std;
struct TreeNode
{
char val=NULL;
TreeNode* left;
TreeNode* right;
};
//构建二叉树
void createTree(TreeNode * &tree) {
char ch;
cin >> ch;
if (ch == '#')
tree = NULL;
else
{
tree = new TreeNode();
tree->val = ch;
createTree(tree->left);
createTree(tree->right);
}
}
//深度遍历
void deepTraverse(TreeNode* tree) {
stack<TreeNode*> sta;
sta.push(tree);
while (!sta.empty()) {
TreeNode* node = new TreeNode();
node = sta.top();/*栈顶元素*/
cout << node->val<<" ";
sta.pop();
if (node->right!=NULL)
sta.push(node->right);
if (node->left!=NULL)
sta.push(node->left);
}
}
//广度遍历
void wideTraverse(TreeNode* tree) {
queue<TreeNode*> que;
que.push(tree);
while (!que.empty())
{
TreeNode* node = que.front();
cout << node->val << " ";
que.pop();
if (node->left!=NULL)
que.push(node->left);
if (node->right!=NULL)
que.push(node->right);
}
}
//前序遍历
void preorder_traversal(TreeNode* tree) {
if (tree != NULL)
{
cout << tree->val << " ";
preorder_traversal(tree->left);
preorder_traversal(tree->right);
}
}
//中序遍历
void inorder_traversal(TreeNode* tree) {
if (tree != NULL)
{
inorder_traversal(tree->left);
cout << tree->val << " ";
inorder_traversal(tree->right);
}
}
//后序遍历
void postorder_traversal(TreeNode* tree) {
if (tree != NULL)
{
postorder_traversal(tree->left);
postorder_traversal(tree->right);
cout << tree->val << " ";
}
}
int main()
{
cout << "输入二叉树:";
TreeNode* tree = NULL;
createTree(tree);
cout << "深度遍历结果:" << endl;
deepTraverse(tree);
cout << endl << "广度遍历结果:" << endl;
wideTraverse(tree);
cout << endl << "前序遍历:" << endl;
preorder_traversal(tree);
cout << endl << "中序遍历:" << endl;
inorder_traversal(tree);
cout << endl << "后序遍历:" << endl;
postorder_traversal(tree);
}