~~~java
//非递归
// 前序遍历顺序:中-左-右,入栈顺序:中-右-左
class Solution {
public List preorderTraversal(TreeNode root) {
List result = new ArrayList<>();
if (root null){
return result;
}
Stack stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()){
TreeNode node = stack.pop();
result.add(node.val);
if (node.right != null){
stack.push(node.right);
}
if (node.left != null){
stack.push(node.left);
}
}
return result;
}
}
// 中序遍历顺序: 左-中-右
class Solution {
public List inorderTraversal(TreeNode root) {
List result = new ArrayList<>();
if (root null){
return result;
}
Stack stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.isEmpty()){
if (cur != null){
stack.push(cur);
cur = cur.left;
}else{
cur = stack.pop();
result.add(cur.val);
cur = cur.right;
}
}
return result;
}
}
// 后序遍历顺序 左-右-中 入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果,相比于就是把前序的左右节点入栈顺序反一下,并将最后结果反转。
class Solution {
public List postorderTraversal(TreeNode root) {
List result = new ArrayList<>();
if (root null){
return result;
}
Stack stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()){
TreeNode node = stack.pop();
result.add(node.val);
if (node.left != null){
stack.push(node.left);
}
if (node.right != null){
stack.push(node.right);
}
}
Collections.reverse(result);
return result;
}
}
java
class Solution:
def decorateRecord(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
tmp = []
res = []
tmp.append(root)
while tmp:
cur = tmp.pop(0)
res.append(cur.val)
if cur.left: tmp.append(cur.left)
if cur.right: tmp.append(cur.right)
return res
共以下 18 个回答
// 前序遍历
“`c++ preorderTraversal(TreeNode* root) { res; st;
class Solution {
public:
vector
if (root == nullptr) return {};
vector
stack
TreeNode* cur = root;
while (cur || !st.empty()) {
if (cur) {
st.push(cur);
res.push_back(cur->val);
cur = cur->left;
} else {
cur = st.top();
st.pop();
cur = cur->right;
}
}
return res;
};
// 后序遍历
“`c++ postorderTraversal(TreeNode* root) { st; res;
class Solution {
public:
vector
if (root == nullptr) return {};
stack
TreeNode* cur = root;
vector
TreeNode* prev = nullptr;
while (cur || !st.empty()) {
while (cur) {
st.push(cur);
cur = cur->left;
}
cur = st.top();
st.pop();
if (cur->right == nullptr || cur->right == prev) {
res.push_back(cur->val);
prev = cur;
cur = nullptr;
} else {
st.push(cur);
cur = cur->right;
}
}
return res;
}
};
“`
class Solution { queue = new LinkedList(); val = new ArrayList();
public int[] decorateRecord(TreeNode root) {
Queue
queue.add(root);
ArrayList
while(!queue.isEmpty()){
TreeNode node = queue.poll();
val.add(node.val);
if(node.left != null) queue.add(node.left);
if(node.right != null) queue.add(node.right);
}
int[] res = new int[val.size()];
for(int i = 0; i < val.size();i++){
res[i] = val.get(i);
}
return res;
}
}时间空间复杂度O(n)
~~~java preorderTraversal(TreeNode root) { result = new ArrayList<>(); stack = new Stack<>();
//非递归
// 前序遍历顺序:中-左-右,入栈顺序:中-右-左
class Solution {
public List
List
if (root null){
return result;
}
Stack
stack.push(root);
while (!stack.isEmpty()){
TreeNode node = stack.pop();
result.add(node.val);
if (node.right != null){
stack.push(node.right);
}
if (node.left != null){
stack.push(node.left);
}
}
return result;
}
}
// 中序遍历顺序: 左-中-右 inorderTraversal(TreeNode root) { result = new ArrayList<>(); stack = new Stack<>();
class Solution {
public List
List
if (root null){
return result;
}
Stack
TreeNode cur = root;
while (cur != null || !stack.isEmpty()){
if (cur != null){
stack.push(cur);
cur = cur.left;
}else{
cur = stack.pop();
result.add(cur.val);
cur = cur.right;
}
}
return result;
}
}
// 后序遍历顺序 左-右-中 入栈顺序:中-左-右 出栈顺序:中-右-左, 最后翻转结果,相比于就是把前序的左右节点入栈顺序反一下,并将最后结果反转。 postorderTraversal(TreeNode root) { result = new ArrayList<>(); stack = new Stack<>();
class Solution {
public List
List
if (root null){
return result;
}
Stack
stack.push(root);
while (!stack.isEmpty()){
TreeNode node = stack.pop();
result.add(node.val);
if (node.left != null){
stack.push(node.left);
}
if (node.right != null){
stack.push(node.right);
}
}
Collections.reverse(result);
return result;
}
}
java
中序遍历
后序遍历
“`
我写一下递归的代码吧。 preorderTraversal(TreeNode root) { result = new ArrayList ();
class Solution {
public List
List
preorder(root, result);
return result;
}
} inorderTraversal(TreeNode root) { res = new ArrayList<>();
// 中序遍历·递归
class Solution {
public List
List
inorder(root, res);
return res;
}
} postorderTraversal(TreeNode root) { res = new ArrayList<>();
// 后序遍历·递归
class Solution {
public List
List
postorder(root, res);
return res;
}
}
二叉树定义
层序遍历
前序遍历
中序遍历
后序遍历
前序遍历
时间复杂度$O(n)$,空间复杂度$O(n)$
中序遍历
时间和空间复杂度同上
后序遍历
注意前序指针prev,因为后序遍历是
前序遍历: res; preorderTraversal(TreeNode root) {
class Solution {
public:
stack<TreeNode> st;
vector
vector
if(root nullptr) return res;
st.push(root);
while(!st.empty())
{
TreeNode *node = st.top();
st.pop();
}; postorderTraversal(TreeNode* root) { result; node = st.top(); inorderTraversal(TreeNode* root) { result;
后序遍历:
class Solution {
public:
vector
stack<TreeNode> st;
vector
if (root NULL) return result;
st.push(root);
while (!st.empty()) {
TreeNode
st.pop();
result.push_back(node->val);
if (node->left) st.push(node->left); // 相对于前序遍历,这更改一下入栈顺序 (空节点不入栈)
if (node->right) st.push(node->right);
}
reverse(result.begin(), result.end());
return result;
}
};
中序遍历:
class Solution {
public:
vector
vector
stack<TreeNode> st;
TreeNode cur = root;
while (cur != NULL || !st.empty()) {
if (cur != NULL) {
st.push(cur);
cur = cur->left;
} else {
cur = st.top();
st.pop();
result.push_back(cur->val);
cur = cur->right;
}
}
return result;
}
};
打卡
https://leetcode.cn/problems/binary-tree-preorder-traversal/solutions/2677830/fei-di-gui-de-er-cha-shu-qian-zhong-hou-q5u54
Definition for a binary tree node.
class TreeNode:
def init(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def decorateRecord(self, root: Optional[TreeNode]) -> List[int]:
if not root:
return []
tmp = []
res = []
tmp.append(root)
while tmp:
cur = tmp.pop(0)
res.append(cur.val)
if cur.left: tmp.append(cur.left)
if cur.right: tmp.append(cur.right)
return res
双 o n
//后续 postorderTraversal(TreeNode root) { ans = new ArrayList<>(); stack = new Stack<>();
class Solution {
public List
List
Stack
TreeNode pre =new TreeNode();
while(root!=null || !stack.empty()){
while(root!=null){//先遍历所有左节点,确保栈出来的节点的左节点都遍历过了
stack.push(root);
root = root.left;
}
root = stack.peek();
if(root.right null || root.right pre){//只有右节点遍历过或者没有右节点的父节点才能被出栈
ans.add(root.val);
pre = root;
root = null;
stack.pop();
}
else
root = root.right;
}
//中序 inorderTraversal(TreeNode root) { ans = new ArrayList<>();
class Solution {
public List
//莫里斯遍历
List
TreeNode
if(root null)
return ans;
while(root!=null){
if(root.left!=null){
TreeNode temp = root.left;
while(temp.right!=null)//找到最右子节点
temp = temp.right;
temp.right = root;
temp = root.left;
root.left = null;
root = temp;
}
else{//没有左子,直接输出
ans.add(root.val);
root = root.right;
}
}
//前序 preorderTraversal(TreeNode root) { stack = new Stack<>(); ans = new ArrayList<>();
class Solution {
public List
//非递归写法
Stack
List
if(root null) return ans;
stack.push(root);
while(!stack.empty()){
TreeNode temp = stack.pop();
ans.add(temp.val);
if(temp.right!=null) stack.push(temp.right);
if(temp.left!=null) stack.push(temp.left);
}
return ans;
}
}
“`C++
#include
#include
#include
using namespace std;
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) {}
};
class Solution { preorderTraversal(TreeNode* root) { result; cur = root;
public:
//先序遍历迭代模式
vector
stack<TreeNode> sub;
vector
TreeNode
do
{
//向左下遍历,并且先访问
while (cur != nullptr)
{
result.push_back(cur->val);
sub.push(cur);
cur = cur->left;
}
};
int main()
{
return 0;
}
“`