二叉树回顾

遍历:

前序遍历: 节点-左-右

使用一个栈来实现,非递归:

class Solution(object):

    def preorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        if not root:return []
        answer=[]
        mystack=[root]
        while mystack:
            now=mystack.pop()
            answer.append(now.val)
            if now.right:mystack.append(now.right)
            if now.left:mystack.append(now.left)
        return answer

嗯,写的麻烦了,判断非空,然后直接append就好了;

def preorderTraversal(self, root):
    ret = []
    stack = [root]
    while stack:
        node = stack.pop()
        if node:
            ret.append(node.val)
            stack.append(node.right)
            stack.append(node.left)
    return ret

后续遍历:左、右、结点

我的思路还是用一个栈来实现,但是这个时候 节点 应该插入在第一位。出栈顺序是 右节点,再是左节点。

class Solution(object):
    def postorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        ret = []
        stack = [root]
        while stack:
            node = stack.pop()
            if node:
                ret=[node.val]+ret
                stack.append(node.left)
                stack.append(node.right)
        return ret

中序遍历:左、节点、右

直接看的好理解的 discuss,就是设置一个标记位:

class Solution:
    def inorderTraversal(self, root):
        stack = [ (False, root) ]
        acc = []

        while stack:
            flag, val = stack.pop()
            if val:
                if not flag:
                    stack.append( (False, val.right) )
                    stack.append( (True, val) )
                    stack.append( (False, val.left) )
                else:
                    acc.append( val.val )
        return acc

层序遍历:

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return []
        ans,level=[],[root]
        while level:
            n,tem=[],[]
            for i in level:
                n.append(i.val)
                tem.extend([i.left,i.right])
            ans.append(n)
            level=[j for j in tem if j]
        return ans

从低向上的层序遍历:

class Solution(object):
    def levelOrderBottom(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root:
            return []
        ans,level=[],[root]
        while level:
            n,tem=[],[]
            for i in level:
                n.append(i.val)
                tem.extend([i.left,i.right])
            ans=[n]+ans
            level=[j for j in tem if j]
        return ans 

求树的层数:104. Maximum Depth of Binary Tree

class Solution(object):
    def maxDepth(self, root):
        if not root:
            return 0
        if not root.left and not root.right:
            return 1
        return 1+max(self.maxDepth(root.left),self.maxDepth(root.right))

class Solution(object):
    def maxDepth(self, root):
        stack=[(root,0)]
        level=0
        while stack:
            p=stack.pop()
            if p[0]:
                level=max(level,p[1]+1)
                stack.extend([(p[0].left,p[1]+1),(p[0].right,p[1]+1)])
        return level
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值