题目:
给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。

解法一(递归)
二叉树的后序遍历:按照访问左子树-右子树-根节点的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此真个遍历过程有天然的递归性质。
通过显示自定义构造递归函数postorder(),定义postorder(root)表示当前遍历到root节点的答案。按照定义,我们只要递归调用postorder(root->left)来遍历root节点的左子树,然后递归调用postorder(root->rigth)来遍历root节点的右子树,最后将root节点的值加入答案即可,递归的终止条件为碰到空节点。如下代码:
class Solution {
public:
void postorder(TreeNode *root, vector<int> &res) {
//判断是否为空,若为空直接return返回
if (root == nullptr) {
return;
}
//调用递归函数,判断左子树和右子树是否为空,均为空才push_back当前根节点的值
postorder(root->left, res);
postorder(root->right, res);
res.push_back(root->val);
}
vector<int> postorderTraversal(TreeNode *root) {
//定义添加的vector数组容器,并调用postorder定义的递归函数
vector<int> res;
postorder(root, res);
return res;
}
};
解法二(迭代)
使用迭代的方法实现解法一的递归函数,两种方式是等价的,区别在于递归的时候隐式地维护一个栈,而在迭代的时候需要显示地将这个栈模拟出来,其余细节相同,如下为笔者代码:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int>result;
stack<TreeNode*> stack1;
if(root==nullptr){
return result;
}
else{
stack1.push(root);
}
while(!stack1.empty()){
if(stack1.top()->left!=nullptr){
stack1.push(stack1.top()->left);
continue;
}
if(stack1.top()->right!=nullptr){
stack1.push(stack1.top()->right);
continue;
}
int a = stack1.top()->val;
result.push_back(a);
stack1.pop();
if(stack1.empty()){
continue;
}
if(stack1.top()!=nullptr and stack1.top()->left!=nullptr){
stack1.top()->left=nullptr;
continue;
}
if(stack1.top()!=nullptr and stack1.top()->right!=nullptr){
stack1.top()->right=nullptr;
}
}
return result;
}
};
笔者小记:利用递归函数进行二叉树遍历时,递归函数需自己定义,递归函数代码量少,但函数逻辑需掌握后才能快速写出,在递归函数中一般都需要再次调用递归函数遍历root节点的左子树和右子树,特别注意递归函数的终止条件为碰到空节点。
405

被折叠的 条评论
为什么被折叠?



