# 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 preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
if not root:
return res
stack = [root]
while stack:
cur = stack.pop()
res.append(cur.val)
if cur.right:
stack.append(cur.right)
if cur.left:
stack.append(cur.left)
return res
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
if not root:
return res
stack = []
cur = root
while cur or stack:
while cur:
stack.append(cur)
res.append(cur.val)
cur = cur.right
cur = stack.pop().left
res.reverse()
return res
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
stack = []
cur = root
while cur or stack:
while cur:
stack.append(cur)
cur = cur.left
cur = stack.pop()
res.append(cur.val)
cur = cur.right
return res
共以下 28 个回答
“`java preOrderNR(){ stack = new ArraySrack<>(); result = new ArrayList<>(); inOrderNR() { stack = new ArrayList<>(); postOrderNR() { Stack = new ArrayStack<>(); result = new ArrayList<>();
前序
public List
Stack
List
根节点入栈
stack.push(root);
while(!stack.isEmpty()) {
//出栈
Node cur = stack.pop();
result.add(cur.e);
//若右孩子不为空 先将右孩子压入栈
if(cur.right!=null){
stack.push(cur.right);
}
if(cur.left!=null){
stack.push(cur.left);
}
}
return result;
}
中序
public List
Stack
while(!stack.isEmpty()||root!=null){
if(root!=null){
stack.push(root);
root=root.left;
}else{
Node node = stack.pop();
result.add(node.e);
root=node.right;
}
}
return result;
}
后序
public List
Stack
List
stack.push(root);
while(!stack.isEmpty()){
Node cur = stack.pop();
result add(cur.e);
if(cur.left!=null){
stack.push(cur.left);
}
if(cur.right!=null){
stack.push(cur.right);
}
}
Collection.reverse(result);
return result;
}
“`C
前序遍历的非递归实现:
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
void preorderTraversal(struct TreeNode* root) {
if (root NULL) {
return;
}
}
中序遍历的非递归实现:
void inorderTraversal(struct TreeNode* root) {
struct TreeNode* stack[1000];
int top = -1;
struct TreeNode* node = root;
}
后序遍历的非递归实现:
void postorderTraversal(struct TreeNode* root) {
if (root NULL) {
return;
}
}
三种DFS以及BFS的非递归实现
递归实现三种遍历方式
前
中
后
遍历了所有节点,另外出创建了栈空间,时间和空间复杂度都为O(N)
思路
代码
三种遍历
非递归方式用栈来实现。后序遍历相当于先序遍历改成中右左再反过来
其中后序遍历稍微有点麻烦,逻辑是这样的
栈弹出一个节点的时候,需要判断它的右子树是遍历了还是没遍历。
1. 如果没遍历,此节点不出栈,令p为右孩子开始遍历右子树
2. 如果遍历了,此节点出栈,把值存到结果里面
判断是否遍历的方式是保留一个prev节点,即上一个被遍历到的节点
如果右孩子不存在或者前一个遍历到的节点prev是它的右孩子,这说明右子树没有或已经遍历完了,采取第二种处理
否则说明并没有处理右子树,采取第一种处理
前序遍历
后序遍历
中序遍历
C++实现
自己只写出了前序遍历,其他的都是借鉴其他打卡的。确实难……
后序遍历,需要一个标志位判断是左子树返回还是右子树。若是左子树返回则切换到右子树继续压栈,反之则出栈。
先序遍历
中序遍历
前序遍历:先将根节点放入栈中,然后将右子树加入栈,再加入左子树(由于入栈先进后出,因此先放右子树,再放左子树),这样出栈的时候才是中左右的顺序
中序遍历:左中右
需要借用指针的遍历来帮助访问节点,栈则用来处理节点上的元素
后序遍历:先序遍历是中左右,后序遍历是左右中
首先调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后再反转result数组,输出结果就是左右中了
二叉树前序遍历的递归和非递归代码
1、递归前序遍历
2、非递归前序遍历
二叉树中序遍历的非递归代码
二叉树后序遍历的非递归代码
一个统一模板
前序遍历是在左右节点处理之前就应该打印(或者是加到列表中。。。)
中序遍历是在右节点处理之前就打印
后续遍历是在左右节点处理之后打印
前序遍历
后序遍历
中序遍历
前序遍历
“` cpp
“`
前序遍历
中序遍历
后序遍历
利用队列的先进先出特点
前序遍历:
中序遍历:按照“左-根-右”的顺序访问二叉树节点。首先递归处理左子树,然后将根节点加入队列,最后递归处理右子树。
后序遍历:从上到下,从右到左放入stack2