树的类:
//树的节点
struct Node
{
Node(int v = 0) :val(v),left(nullptr),right(nullptr) {};
int val;
Node *left;
Node *right;
};
递归:
//后序遍历----递归
void postorder_recursion(Node *node)
{
if (node)
{
if (node->left)
postorder_recursion(node->left);
if (node->right)
postorder_recursion(node->right);
cout << node->val << " ";
}
}
非递归,用栈实现:
//后序遍历----循环
void postorder_stack(Node* root) {
if (!root) return;
stack<Node*> postorder_s;
Node* current = root;
postorder_s.push(current);
postorder_s.push(current); // 每个结点 push 两次,这样可以简单的判断出哪些结点是否处理过
while (!postorder_s.empty()) {
current = postorder_s.top();
postorder_s.pop();
if (!postorder_s.empty() && current == postorder_s.top()) { //当处理过了,那么就不会再次进行孩子压栈了
if (current->right) {
postorder_s.push(current->right);
postorder_s.push(current->right);
}
if (current->left) {
postorder_s.push(current->left);
postorder_s.push(current->left);
}
}
else {
cout<<current->val<< " ";
}
}
}
下面是一种很好的思路:
//树的后序遍历 左右中
//因为先序遍历是中左右,如果将左右子树调个存,则就是中右左,然后将其不打印,存入栈中,
//正好是逆序输出,为左右中
void tail_sort(TreeNode<int> *head)
{
if (head) return;
stack< TreeNode<int>*> pri;
stack< TreeNode<int>*> inv_pri;
pri.push(head);
inv_pri.push(head);
while (!pri.empty())
{
TreeNode<int>* node = pri.top();
pri.pop();
if (node->right) {
pri.push(node->right);
inv_pri.push(node->right);
}
if (node->left) {
pri.push(node->left);
inv_pri.push(node->left);
}
}
while (!inv_pri.empty())
{
cout << inv_pri.top()->val << endl;
inv_pri.pop();
}
}