【Leetcode】110. Balanced Binary Tree 解题报告

【Leetcode】110. Balanced Binary Tree 解题报告
判断一个树是不是平衡二叉树

方法1 递归

对于某个节点。求其左右子树的高度差,如果满足,再递归的判断左右子树。这是一种自顶而下的方法

class Solution1:
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if root == None:
            return True
        else:
            if abs(self.getHeight(root.left) -  self.getHeight(root.right)) <=1:
                return  self.isBalanced(root.left) and self.isBalanced(root.right)
            else:
                return False

    def getHeight(self, root):
        if root == None:
            return 0
        else:
            return max(self.getHeight(root.left), self.getHeight(root.right))+1

方法2 改进版递归

上面的方法重复计算了很多节点的深度,我们可以自底向上,如果不满足就返回-1,判断根节点的返回值即可。

class Solution2:
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        return self.getHeight(root) != -1

    def  getHeight(self,root):
        if root == None:
            return 0
        l = self.getHeight(root.left)
        if l == -1:
            return -1
        r = self.getHeight(root.right)
        if r == -1:
            return -1
        if abs(l - r) > 1:
            return -1
        else:
            return max(l, r)+1

方法三 非递归 需要修改节点的val

非递归法主要通过栈来完成,是一个自底向上的过程,最难的过程就是子节点的深度确定后如何确定父节点的深度
一个方法是修改节点的值为该节点自底向上的深度,即方法三
另一个方法就是讲节点的深度保存到一个map里,即方法四

class Solution3:
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        if root == None:
            return True
        stack = []
        prev = None
        pNode = root
        while(len(stack) or pNode):
            if pNode != None:
                stack.append(pNode)
                pNode = pNode.left
            else:
                pNode = stack[-1]
                if pNode.right == prev or pNode.right == None:
                    stack.pop()
                    prev = pNode
                    if pNode.left == None or pNode.right == None:
                        if pNode.left == None and pNode.right == None:
                            pNode.val = 1
                        else:
                            node = pNode.left if pNode.left != None else pNode.right
                            if node.val >=2:
                                return False
                            pNode.val = node.val +1
                    else:
                        l = pNode.left.val
                        r = pNode.right.val
                        if abs(l -r) >1 :
                            return False
                        else:
                            pNode.val  = max(pNode.left.val, pNode.right.val) +1
                    pNode = None
                else:
                    pNode = pNode.right
        return True

方法四 非递归 map作为辅助空间

class Solution4:
    def isBalanced(self, root):
        """
        :type root: TreeNode
        :rtype: bool
        """
        pNode, prev, dictionary, stack = root, None, {}, []
        while(len(stack) or pNode):
            if pNode:
                stack.append(pNode)
                pNode = pNode.left
            else:
                pNode = stack[-1]
                if pNode.right == None or pNode.right == prev:
                    stack.pop()
                    l = dictionary.get(pNode.left, 0)
                    r = dictionary.get(pNode.right, 0)
                    if abs(l - r) > 1:
                        return False
                    else:
                        dictionary[pNode] = max(l, r) +1
                    prev =  pNode
                    pNode = None
                else:
                    pNode = pNode.right
        return True