lintcode练习-66.67.68.二叉树的三种递归遍历和非递归遍历

204 篇文章 0 订阅
190 篇文章 5 订阅

 

二叉树的先序, 中序, 后序遍历 都是属于深度优先遍历。

 

 

 

直接上代码:

先序遍历:

 

 

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None

class Solution:
    """
    @param root: A Tree
    @return: Preorder in ArrayList which contains node values.
    """
    def preorderTraversal(self, root):
        # write your code here
        self.results = []
        self.traverse(root)
        return self.results

    def traverse(self, root):
        if root is None:
            return
        self.results.append(root.val)
        self.traverse(root.left)
        self.traverse(root.right)


# 非递归版本
class Solution1:
    def preorderTraversal(self, root):
        if root is None:
            return []
        stack = [root]
        preorder = []
        while stack:
            node = stack.pop()
            preorder.append(node.val)
            if node.right:  # 先放入右子树
                stack.append(node.right)
            if node.left:  # 再放入左子树, 这样能保证左子树先被弹出
                stack.append(node.left)
        return preorder

 

 

中序遍历:

 
# Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None

class Solution:
    """
    @param root: A Tree
    @return: Inorder in ArrayList which contains node values.
    """

    def inorderTraversal(self, root):
        # write your code here
        self.results = []
        self.traverse(root)
        return self.results

    def traverse(self, root):
        if root is None:
            return
        self.traverse(root.left)
        self.results.append(root.val)
        self.traverse(root.right)


# 添加所有最左边节点到栈。
# pop stack 然后添加到结果。
# 查找当前node的右边节点是否为空, 如果不为空,重复step 1。

class Solution:
    def inorderTraversal(self, root):
        if root is None:
            return []
        stack = []
        inorder = []
        while root:
            stack.append(root)
            root = root.left

        while stack:
            node = stack.pop()
            inorder.append(node.val)

            if node.right:
                node = node.right
                while node:
                    stack.append(node)
                    node = node.left
        return inorder

 

 

 

后序遍历:

# Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None


class Solution:
    """
    @param root: A Tree
    @return: Preorder in ArrayList which contains node values.
    """
    def preorderTraversal(self, root):
        # write your code here
        self.results = []
        self.traverse(root)
        return self.results

    def traverse(self, root):
        if root is None:
            return
        self.traverse(root.left)
        self.traverse(root.right)
        self.results.append(root.val)



# 二叉树的非递归后序遍历
#
# 在实现遍历的循环中维持一种不变的关系:
#
# 栈中结点序列的左边是二叉树已遍历过的部分,右边是尚未遍历的部分
# 如果curNode不空,其父结点就是栈顶结点
# curNode空时,栈顶就是应访问的结点
# 根据被访问结点是其父结点的左子结点或右子结点,就可以决定下一步怎么做:
# 如果是左子结点就转到右兄弟;如果是右子结点,就应该处理根结点并强制退栈

class Solution:
    """
    @param root: A Tree
    @return: Postorder in ArrayList which contains node values.
    """

    def postorderTraversal(self, root):
        # write your code here
        if root is None:
            return  []
        stack = []
        postorder = []

        while stack or root:
            while root:
                stack.append(root)
                root = root.left if root.left else root.right

            root = stack.pop()
            postorder.append(root.val)
            if stack and stack[-1].left == root:
                root = stack[-1].right
            else:
                root = None

        return postorder
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值