递归法后序遍历二叉树
后续遍历一颗二叉树即按照先后续遍历左子树,再后续遍历右子树,最后遍历根节点。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。
/**
* 下面是二叉树的定义.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
vector<int>res;
vector<int> postorderTraversal(TreeNode* root) {
if(root==NULL) return res;
if(root->left) {postorderTraversal(root->left);}
if(root->right) { postorderTraversal(root->right);}
res.push_back(root->val);//每次
return res;
迭代法后序遍历二叉树
其实迭代法就是用迭代去等价实现递归,两种方法相同,但是由于递归是会有隐式的一个需要维护的栈,而迭代是显示的去模拟这个栈,具体实现参见下面代码:
/**
* 下面是二叉树的定义.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
vector<int> postorderTraversal(TreeNode* root) {
vector<int>res;
if(root==nullptr) return res;
stack<TreeNode*>stk;
TreeNode* prev=nullptr;
while(root!=nullptr||!stk.empty()){
/*第一次进循环体肯定是因为root不为空,
但是不可以把这个root!=null这个条件去掉,
而在进while之前让root入栈,
因为要为了下面的while的遍历方便。
*/
while(root!=nullptr){
//这个循环就是每次都从当前根节点遍历它的左子树
stk.emplace(root);
root=root->left;
}
root=stk.top(); //取栈顶元素
stk.pop();
if(root->right==nullptr||root->right==prev){
/*如果当前栈顶元素没有右节点或者右节点上轮刚遍历过的节点,
直接将根节点(栈顶元素)放入答案数组中,
这里不需要判断该节点的左节点,因为我们是从左边节点一直
遍历下来的,所以要么没有左节点,要么左节点就已经遍历过了。*/
res.emplace_back(root->val);
prev=root;
root=nullptr;
}
/*不满足上述条件的,说明其该根节点(栈顶元素)还有右节点,
又开始后序遍历该以该节点为根的二叉树*/
else{
stk.emplace(root);
root=root->right;
}
}
return res;
}
我的注释可能写的不太好,但由于本人才疏学浅,这也是没有办法的!害。