先序遍历(根左右)
中序遍历(左根右)
后序遍历(左右根)
记忆方法:其实很简单,看名字就记住。看根的位置,左右的顺序是固定的,先,则根在最左边,中,则根在中间,后,则根在右边。
struct Node
{
int value;
Node* left;
Node* right;
Node(int val) :value(val), left(nullptr), right(nullptr) {}
};
//先序
void PreOrderRecur(Node* head)
{
if (head == nullptr) return;
cout << head->value << endl;
PreOrderRecur(head->left);
PreOrderRecur(head->right);
}
//中序
void MidOrderRecur(Node* head)
{
if (head == nullptr) return;
MidOrderRecur(head->left);
cout << head->value << endl;
MidOrderRecur(head->right);
}
//后序
void PosOrderRecur(Node* head)
{
if (head == nullptr) return;
PosOrderRecur(head->left);
PosOrderRecur(head->right);
cout << head->value << endl;
}
//非递归的先序
void PreOrder(Node* head)
{
if (head == nullptr) return;
stack<Node*> strongStack;
strongStack.push(head);
while (!strongStack.empty())
{
Node* data =strongStack.top();
cout<<data->value<<endl;
strongStack.pop();
if (data->right)
{
strongStack.push(data->right);
}
if (data->left)
{
strongStack.push(data->left);
}
}
}
//非递归的中序
void MidOrder(Node* head)
{
if (head == nullptr) return;
stack<Node*> strongStack;
while (!strongStack.empty()||head)
{
if (head)
{
strongStack.push(head);
head = head->left;
}
else
{
Node* data = strongStack.top();
cout << data->value << endl;
strongStack.pop();
head = head->right;
}
}
}
//非递归的后序
void PosOrder(Node* head)
{
if (head == nullptr) return;
stack<Node*> stack1, stack2;
stack1.push(head);
while (!stack1.empty())
{
Node* data = stack1.top();
stack2.push(data);
stack1.pop();
if (data->left)
{
stack1.push(data->left);
}
if (data->right)
{
stack1.push(data->right);
}
}
while (!stack2.empty())
{
cout << stack2.top()->value << endl;
stack2.pop();
}
}