ACM-后序遍历(简单方法和正规方法)
1.后序遍历简单方法
/*
*二叉树遍历一般有三种方法:前序,中序,后序。
*其中前序遍历u顺序为:根->左子树->右子树,在此定义一种新的遍历方法:根->右子树->左子u树
*使用我们新定义的方法遍历二叉树之后,再用reverse()函数反转一下,便得到后序遍历序列!
*以下是具体实现代码:
*/
vector<int> postorderTraversal(TreeNode *root) { vector<int> postorderTraversal; //后续遍历 if(root == nullptr) return postorderTraversal; stack<TreeNode *> tempStack; tempStack.push(root); while(tempStack.size() != 0){ TreeNode *p = tempStack.top(); tempStack.pop(); postorderTraversal.push_back(p->val); if(p->left != nullptr) tempStack.push(p->left); if(p->right != nullptr) tempStack.push(p->right); } reverse(postorderTraversal.begin(),postorderTraversal.end()); return postorderTraversal; }
2.后序遍历正规方法
/*
*非递归进行后序遍历
*利用栈的特性进行后序遍历,每个节点有三种情况:
* 1.此节点左右子树不是都为空,那么将此节点的右节点、左节点分别按照顺序入栈,先右后左的顺序保证了出栈时是先遍历左子树,再遍历右子树的
* 2.此节点左右子树都为空,则遍历此节点,并将此节点从栈中删除
* 3.上一次遍历的节点是此节点的左或右节点,那么此次应该遍历的节点就是此节点
*/
vector<int> postorderTraversal(TreeNode *root) { vector<int>res; //后序遍历的序列 stack<TreeNode *>tempStack; if(root == nullptr) return res; tempStack.push(root); TreeNode *preNode = nullptr; while(tempStack.size() != 0){ TreeNode *current = tempStack.top(); //取出栈顶元素,不删除 if((current->left == nullptr && current->right == nullptr) || (preNode != nullptr && (preNode == current->left || preNode == current->right))) { res.push_back(current->val); tempStack.pop(); preNode = current; } else{ if(current->right != nullptr) tempStack.push(current->right); if(current->left != nullptr) tempStack.push(current->left); } } return res; }