- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
题目地址:https://leetcode.com/problems/binary-tree-postorder-traversal/
Given a binary tree, return the postorder traversal of its nodes' values.
Example:
Input: [1,null,2,3]
1
\
2
/
3
Output: [3,2,1]
Follow up: Recursive solution is trivial, could you do it iteratively?
二叉树的后序遍历。
最常见最简单的方法就是DFS。先把左右子树递归完成,然后把根节点的值也放入结果中。
C++代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if (!root) return res;
vector<int> left = postorderTraversal(root->left);
vector<int> right = postorderTraversal(root->right);
res.insert(res.end(), left.begin(), left.end());
res.insert(res.end(), right.begin(), right.end());
res.push_back(root->val);
return res;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
Python代码如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def postorderTraversal(self, root):
"""
:type root: TreeNode
:rtype: List[int]
"""
res = []
if not root: return res
if root.left:
res.extend(self.postorderTraversal(root.left))
if root.right:
res.extend(self.postorderTraversal(root.right))
res.append(root.val)
return res
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
题目中说了递归方法太琐碎,能不能用迭代方法解决呢?
由于后序遍历把根节点放到了最后,而我们在遍历的过程中,一定先获得到根节点,那么我们可以先倒序,然后再反转。
后序遍历:左->右->根
。 我们的做法:根->右->左
,然后再反转。
即,先把根节点放入栈中,然后把它左孩子、右孩子依次放入,这样我们下次对栈内的元素遍历得到的顺序就是从右向左的,对于栈中弹出的每个节点都是如此。
得到的顺序是根->右子树(节点全部入栈)->左子树
的遍历方式,最后需要加一个翻转即可得到想要的后序遍历。
C++代码如下:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if (!root) return res;
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
TreeNode* node = st.top(); st.pop();
if (!node) continue;
res.push_back(node->val);
st.push(node->left);
st.push(node->right);
}
reverse(res.begin(), res.end());
return res;
}
};
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
2022
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发
在二叉树中输入以下值({18、26、52、78、45、16、67、58、73、11})时,您会收到此树: PreOrder 和 InOrder 遍历都按照我的预期工作。但是,当谈到 PostOrder
题目地址:https://leetcode.com/problems/binary-tree-postorder-traversal/ 题目描述 Given a binary tree, retu
我想编写一个程序,可以构建二叉搜索树并显示 “预序”、“中序”和“后序”。 第一个输入是输入系列的数量。从第二行开始,每一行代表一个串行输入,用于构建二叉搜索树。 输入: 3 9,5,6,7,1,8,
#include struct tree { int data; struct tree *left; struct tree *right; }; struct tree *
这是一个关于修剪二叉树的算法。例如: 1 1 / \ \ 0 1 =>
我知道如果没有中序和先序/后序遍历就无法构建树。因为对于给定的(仅 Inorder/Preorder/postorder),可能会生成更多数量的树。是否有任何算法或机制可以根据给定的(仅中序/先序/后
我在编写一些作业时遇到了一些问题。我应该编写一个通用二叉搜索树实用程序,包括一个返回树的后序遍历的 ArrayList 的方法。我的代码可以编译,但它会为除空树之外的所有树抛出 NullPointer
我需要一些递归方面的帮助。我正在尝试在 C# 中做一个二叉树,我想知道是否可以使用递归函数演示所有 Inorder/PostOrder 和 PreOrder 遍历。 我已经为 PreOrder 完成了
题目地址:https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/descri
我最近一直在研究 leetcode 并且很困惑为什么我的解决方案在我提交给 Leetcode 时会超时。 这是问题: https://leetcode.com/explore/learn/card/d
我收到了一项任务,要求我必须从二叉树的 preOder 和 inOrder 返回其 postOrder 。用纸和铅笔来做这件事很容易,但任务是开发一个自动做这件事的java函数。它必须在 java 中
morris 遍历非常适用于 O(n) 时间和 O(1) 空间的 InOrder 遍历。是否有可能仅通过更改一些东西来使用相同的算法实现 PreOrder 和 PostOrder 遍历。 最佳答案 我
我是一名优秀的程序员,十分优秀!