バランスツリーかどうかを判断する

7048 ワード

タイトルの説明
ツリーを入力し、そのツリーがバランスツリーであるかどうかを判断します.
へいこうにじゅ
定義:空のツリーまたは左右の2つのサブツリーの高さ差の絶対値は1を超えず、左右の2つのサブツリーはバランスのとれた2つのツリーです.例:
             
 1:
        E
     /    \
    A      D
   / \
  B   C
  
 2:
       E
     /
    A
   / \
  B   C
  
 3:
        E
     /    \
    A      D
   / \      \
  B   C      F
               \
                G

例1はバランスツリーであり,バランスツリーの定義を満たす.Eの左サブツリーの深さは3,Eの右サブツリーの深さは2であり,左右のサブツリーはバランスツリーである.
例2は平衡二叉木ではなく,Eの左サブツリー深さは3,Eの右サブツリー深さは1であった.
例3はバランスツリーではなく,Eの右サブツリーはバランスツリーではない.
Python実現
# -*- coding: utf-8 -*-
"""
     
        E
     /    \
    A      D
   / \      \
  B   C      F
              \
               G
"""
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

class Solution:
    def isbanlance(self, p):
        if p is None:
            return True
        left = self.depth(p.left)
        right = self.depth(p.right)
        return abs(left - right) <= 1 and self.isbanlance(p.left) and self.isbanlance(p.right)

    def depth(self, p):
        if p is None:
            return 0
        return 1 + max(self.depth(p.left), self.depth(p.right))


if __name__ == '__main__':
    a = TreeNode("A")
    b = TreeNode("B")
    c = TreeNode("C")
    d = TreeNode("D")
    e = TreeNode("E")
    f = TreeNode("F")
    g = TreeNode("G")

    root = e
    e.left = a
    e.right = d
    a.left = b
    a.right = c
    d.right = f
    f.right = g
    s = Solution()
    result = s.isbanlance(root)
    print(result)

出力結果:False