二叉树的遍历
1.二叉树的遍历方式
二叉树的遍历分为前序遍历,中序遍历,后序遍历
- 前序遍历:先访问根结点,再遍历根结点的左子树,最后遍历根结点的右子树
- 中序遍历:先遍历根结点的左子树,再访问根结点,最后遍历根结点的右子树
- 后序遍历:先遍历根结点的左子树,再遍历根结点的右子树,最后访问根结点
上图的前序遍历为:A, B,D,G,H, C,E,I,F
中序遍历为:G,D,H,B, A E,I,C,F
后序遍历为:G,H,D,B I,E,F,C A
2.算法实现
二叉树的存储结构:本文采用二叉树链表方式
typedef char ElemType;
struct TreeNode
{
TreeNode* left;
TreeNode* right;
ElemType data;
TreeNode(ElemType dat) :data(dat) { left = right = nullptr; }
};
建立二叉树:
TreeNode* CreateTree()
{
TreeNode* g_root =nullptr;
TreeNode* pnew = new TreeNode('A');
g_root = pnew;
pnew->left = new TreeNode('B');
pnew->right = new TreeNode('C');
TreeNode* pL = pnew->left;
pL->left = new TreeNode('D'); //B结点的左分支
pL = pL->left;
pL->left = new TreeNode('G'); //D结点的左分支
pL->right = new TreeNode('H'); //D结点的右分支
TreeNode* pR = pnew->right;
pR->left = new TreeNode('E'); //C结点的左分支
pR->right = new TreeNode('F');//C结点的右分支
pR = pR->left;
pR->right = new TreeNode('I');//E结点的右分支
return g_root;
}
递归方式的前序遍历:
void PreOrder(TreeNode* node)
{
if (node == nullptr)
return;
std::cout << node->data << " ";
PreOrder(node->left);
PreOrder(node->right);
}
递归方式的中序遍历
void MedOrder(TreeNode* node)
{
if (node == nullptr)
return;
MedOrder(node->left);
std::cout << node->data << " ";
MedOrder(node->right);
}
递归方式的后序遍历
void LastOrder(TreeNode* node)
{
if (node == nullptr)
return;
LastOrder(node->left);
LastOrder(node->right);
std::cout << node->data << " ";
}
主函数:
#include<iostream>
int main()
{
TreeNode* g_root = CreateTree();
PreOrder(g_root);
std::cout << "\n ";
MedOrder(g_root);
std::cout << "\n ";
LastOrder(g_root);
std::cout << "\n ";
system("pause");
return 0;
}
非递归方式的前序遍历
非递归方式是采取一个栈(先进后出)来实现:
void PreOrder2(TreeNode* node)
{
std:: stack<TreeNode*> s;
while (node || !s.empty())
{
if (node)
{
s.push(node);
std::cout << node->data << " ";
node = node->left;
}
else
{
node = s.top();
s.pop();
node = node->right;
}
}
}
非递归方式的中序遍历
void MedOrder2(TreeNode* node)
{
std:: stack<TreeNode*> s;
while (node || !s.empty())
{
if (node)
{
s.push(node);
node = node->left;
}
else
{
node = s.top();
s.pop();
std::cout << node->data << " ";
node = node->right;
}
}
}