LeetCode145-二叉树的后序遍历
最近全国疫情严重,待在家里没事干,马上又要准备春招了,最近刷刷题,记录一下!再说一句,武汉加油,大家出门记得戴口罩!
1、题目
给定一个二叉树,返回它的后序遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [3,2,1]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
2、思路
首先,定义树的存储结构 TreeNode。
/* Definition for a binary tree node. */
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
基于递归求解:
void fun(tree){
fun(tree->left);
fun(tree->right);
tree->val;
}
基于栈的遍历:
过程:将整棵树的最左边的一条链压入栈中,每次取出栈顶元素,如果它有右子树,则将右子树压入栈中。
3、代码
递归实现:
class Solution {
public:
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;
}
};
基于栈的遍历:
复杂度分析
时间复杂度:O(n)。
空间复杂度:O(n)。
c++
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode* > stk;
auto p=root;
while(p||stk.size())
{
while(p)
{
stk.push(p);
p=p->left;
}
p=stk.top();
stk.pop();
res.push_back(p->val);
p=p->right;
}
return res;
}
};
Java
class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<>();
LinkedList<Integer> output = new LinkedList<>();
if (root == null) {
return output;
}
stack.add(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pollLast();
output.addFirst(node.val);
if (node.left != null) {
stack.add(node.left);
}
if (node.right != null) {
stack.add(node.right);
}
}
return output;
}
}