1、二叉树节点的结构
typedef char ElementType;
typedef struct BTNode
{
BTNode* LeftNode;
BTNode* RightNode;
ElementType data;
}BTNode;
2、递归遍历
(1)前序遍历
void PreOrder(BTNode* root)
{
if (root == nullptr)return;
else
{
cout << root->data << " ";//先打印根节点
PreOrder(root->LeftNode);//递归访问左孩子
PreOrder(root->RightNode);//递归访问右孩子
}
}
(2)中序遍历
void InOrder(BTNode* root)
{
if (root == nullptr)return;
else
{
InOrder(root->LeftNode);
cout << root->data << " ";
InOrder(root->RightNode);
}
}
(3)后序遍历
void PastOrder(BTNode* root)
{
if (root == nullptr)return;
else
{
PastOrder(root->LeftNode);
PastOrder(root->RightNode);
cout << root->data << " ";
}
}
3、非递归遍历
二叉树的非递归是借助栈来实现
(1)前序遍历
思路:将根节点先入栈,判断栈是否为空,不为空,获取栈顶元素并出栈,判断右左孩子是否为空,不为空先将右孩子入栈,再将左孩子入栈.出栈的时候就是先左后右
void NicePreOrder(BTNode* ptr)
{
if (ptr == nullptr)return;//判断根节点是否为空
stack<BTNode*>stk;//定义一个BTNode* 类型的栈
stk.push(ptr);//将根节点入栈
while (!stk.empty())//判断是否为空
{
ptr = stk.top(); stk.pop();//获取栈顶元素并出栈
cout << ptr->data << " ";//进行打印
if (ptr->RightNode != nullptr)//判断右孩子是否为空,不为空入栈,因为栈是先进后出,所以将右孩子先入栈
{
stk.push(ptr->RightNode);
}
if (ptr->LeftNode != nullptr)//判断左孩子是否为空,不为空入栈
{
stk.push(ptr->LeftNode);
}
}
}
(2)中序遍历
void NiceInOrder(BTNode* ptr)
{
if (ptr == nullptr)return;
stack<BTNode*> stk;
while (!stk.empty() || ptr != nullptr)
{
while (ptr != nullptr)
{
stk.push(ptr);
ptr = ptr->LeftNode;
}
ptr = stk.top(); stk.pop();
cout << ptr->data << " ";
ptr = ptr->RightNode;
}
}
(3)后序遍历
void NicePastOrder(BTNode* ptr)
{
if (ptr == nullptr)return;
stack<BTNode*>stk;
BTNode* tag = nullptr;
while (!stk.empty() || ptr != nullptr)
{
while (ptr != nullptr)
{
stk.push(ptr);
ptr = ptr->LeftNode;
}
ptr == stk.top(); stk.pop();
if (ptr->RightNode == nullptr || ptr->RightNode == tag)
{
cout << ptr->data << " ";
tag = ptr;
ptr = nullptr;
}
else
{
stk.push(ptr);
ptr = ptr->RightNode;
}
}
}