从树开始刷题(二)

中等题

94. 二叉树的中序遍历

https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
不使用递归的方法

    def inorderTraversal(self, root: TreeNode) -> List[int]:
        self.result = []
        self.nodelist = []
        p = root
        while p != None or self.nodelist:
            while p != None:
                self.nodelist.append(p)
                p = p.left
            p = self.nodelist.pop()
            self.result.append(p.val)
            p = p.right
        return self.result

105. 从前序与中序遍历序列构造二叉树

https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/
抓住前序和中序的特点,前序遍历(根节点先行),中序遍历(根节点左侧数字是左子树,右侧是右子树)。
先通过前序数组找根节点,接着通过中序得到左右子树数组长度,然后在前序数组中找到左子树根和右子树根。递归向下

    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if not preorder:
            return None
        root = TreeNode(preorder[0])
        inorder_mid = inorder.index(preorder[0])
        root.left = self.buildTree(preorder[1:1+len(inorder[:inorder_mid])], inorder[0:inorder_mid])
        root.right = self.buildTree(preorder[1+len(inorder[:inorder_mid]):], inorder[inorder_mid+1:])
        return root

106. 从中序与后序遍历序列构造二叉树

https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
和上题类似

    def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
        if not postorder:
            return None
        tmp = postorder.pop()
        root = TreeNode(tmp)
        index = inorder.index(tmp)
        left_len = len(inorder[:index])
        root.left = self.buildTree(inorder[:index], postorder[:left_len])
        root.right = self.buildTree(inorder[index+1:],postorder[left_len:])
        return root
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值