二叉树的遍历(py)

前序

# recursively
def preorderTraversal1(self, root):
    res = []
    self.dfs(root, res)
    return res
    
def dfs(self, root, res):
    if root:
        res.append(root.val)
        self.dfs(root.left, res)
        self.dfs(root.right, res)

# iteratively
class Solution:
    def preorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        stack,ans=[root],[]
        while stack:
            node=stack.pop()
            ans.append(node.val)
            if node.right:
                stack.append(node.right)
            if node.left:
                stack.append(node.left)
        return ans

中序

go版本

func inorderTraversal(root *TreeNode) []int {
    
    res, stack, cur := []int{},[]*TreeNode{},root
    for len(stack) > 0 || cur != nil {
        for cur != nil {
            stack = append(stack, cur)
            cur = cur.Left
        }
        node := stack[len(stack)-1]
        res = append(res, node.Val)
        stack = stack[:len(stack)-1]
        cur = node.Right
    }
    return res
}
# recursively
def inorderTraversal1(self, root):
    res = []
    self.helper(root, res)
    return res
    
def helper(self, root, res):
    if root:
        self.helper(root.left, res)
        res.append(root.val)
        self.helper(root.right, res)
 

# iteratively       
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if not root:
            return []
        cur,stack,ans=root,[],[]
        while stack or cur:
            while cur:
                stack.append(cur)
                cur=cur.left
            cur=stack.pop()
            ans.append(cur.val)
            cur=cur.right
        return ans

后序

# recursively 
def postorderTraversal1(self, root):
    res = []
    self.dfs(root, res)
    return res
    
def dfs(self, root, res):
    if root:
        self.dfs(root.left, res)
        self.dfs(root.right, res)
        res.append(root.val)
        
## 标准的后序迭代
class Solution:
    def postorderTraversal(self, root: TreeNode) -> List[int]:
        res = []   # 用来存储后序遍历节点的值
        stack = []  
        node = root
        while stack or node:
            while node:
                stack.append(node)  # 第一次入栈的是根节点
                #判断当前节点的左子树是否存在,若存在则持续左下行,若不存在就转向右子树
                node = node.left if node.left is not None else node.right
            #循环结束说明走到了叶子节点,没有左右子树了,该叶子节点即为当前栈顶元素,应该访问了
            node = stack.pop() # 取出栈顶元素进行访问
            res.append(node.val) # 将栈顶元素也即当前节点的值添加进res
            # (下面的stack[-1]是执行完上面那句取出栈顶元素后的栈顶元素)
            if stack and stack[-1].left == node: #若栈不为空且当前节点是栈顶元素的左节点
                node = stack[-1].right   ## 则转向遍历右节点
            else:
                node = None  # 没有左子树或右子树,强迫退栈
        return res        
       
        
# iteratively2 保存节点遍历状态的迭代,和使用双栈,一个栈放node,一个栈放flag一样
class Solution:
    def postorderTraversal(self, root):
        traversal, stack = [], [(root, False)]
        while stack:
            node, visited = stack.pop()
            if node:
                if visited:
                    # add to result if visited
                    traversal.append(node.val)
                else:
                    # post-order
                    stack.append((node, True))
                    stack.append((node.right, False))
                    stack.append((node.left, False))
        return traversal
        
# iteratively3(前序遍历取反,最好不要用)       
def postorderTraversal(self, root):
    res, stack = [], [root]
    while stack:
        node = stack.pop()
        if node:
            res.append(node.val)
            stack.append(node.left)
            stack.append(node.right)
    return res[::-1]

层序

go版本

func inorderTraversal(root *TreeNode) []int {
    
    res, stack, cur := []int{},[]*TreeNode{},root
    for len(stack) > 0 || cur != nil {
        for cur != nil {
            stack = append(stack, cur)
            cur = cur.Left
        }
        node := stack[len(stack)-1]
        res = append(res, node.Val)
        stack = stack[:len(stack)-1]
        cur = node.Right
    }
    return res
}

从第一层打印到最后一层

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        ans=[]
        cur_stack=[root]
        while cur_stack:
            next_stack,tmp=[],[]
            for node in cur_stack:
                tmp.append(node.val)
                if node.left:
                    next_stack.append(node.left)
                if node.right:
                    next_stack.append(node.right)
            cur_stack=next_stack
            ## 如果是从最后一层打印到第一层,改成ans.insert(0,tmp)就好了
            ans.append(tmp)
        return ans
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树的非递归遍可以使用栈来实现。具体步骤如下: 1. 新建一个栈,将根节点入栈; 2. 循环执行以下步骤,直到栈为空: 1. 弹出栈顶节点并访问它; 2. 如果该节点有右子节点,则将右子节点入栈; 3. 如果该节点有左子节点,则将左子节点入栈。 下面是实现二叉树的前序、中序和后序遍的非递归代码示例: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def preorderTraversal(root: TreeNode) -> List[int]: if not root: return [] stack, res = [root], [] while stack: node = stack.pop() res.append(node.val) if node.right: stack.append(node.right) if node.left: stack.append(node.left) return res def inorderTraversal(root: TreeNode) -> List[int]: if not root: return [] stack, res = [], [] node = root while node or stack: while node: stack.append(node) node = node.left node = stack.pop() res.append(node.val) node = node.right return res def postorderTraversal(root: TreeNode) -> List[int]: if not root: return [] stack1, stack2, res = [root], [], [] while stack1: node = stack1.pop() stack2.append(node) if node.left: stack1.append(node.left) if node.right: stack1.append(node.right) while stack2: res.append(stack2.pop().val) return res ``` 其中,前序遍使用一个栈来存储未处理的节点,中序遍使用两个栈来存储未处理的节点和已处理的节点,后序遍也使用两个栈来存储未处理的节点和已处理的节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值