Haskell学习笔记7 - 平衡二叉树

首先连了解一下什么是平衡二叉树

 左右子树的高度差不能超过1

子树也必须是一颗平衡二叉树

Haskell学习笔记7 - 平衡二叉树_第1张图片

这里有两个叶子节点(叶子节点就是没有子节点的节点),叶子节点由于没有任何子树所以永远都是平衡的,看到就可以忽略。只有A是分支节点,它的左右子树的高度都为1,所以平衡

先定义一棵树

data BinTree x = Lf Int | Branch (BinTree x) x (BinTree x) 
 deriving (Eq, Show)

Q1

定义一个函数nullBR,实现最小的平衡二叉树

最小其实就是空树,直接定义为0就可以了

nullBR :: BinTree x 
nullBR = Lf 0

Q2

testBal :: Bool
testBal = 
    (isTreeBal (nullBR) == True ) &&
    (isTreeBal (Branch (Lf 1) 1 (Branch (Lf 2) 2 (Branch (Lf 3) 3 (Lf 3))))  == False ) &&
    (isTreeBal (Branch (Branch (Lf 2) 1 (Lf 2)) 2 (Branch (Lf 2) 3 (Lf 2))) == True )

定义一个函数isTreeBal,判断是否为平衡树

treeNodes :: BinTree a -> Int
isTreeBal (Lf n) = True
isTreeBal (Branch left y right) = (fromRoot left == fromRoot right) && isTreeBal left && isTreeBal right
    where
      fromRoot (Lf x) = x
      fromRoot (Branch lf rn rt) = 1 + max (fromRoot lf) (fromRoot rt)

如上所说,左右子树的高度差不能超过1,并且左右子树都要平衡

Q3

testN :: Bool 
testN = 
    (treeNodes nullBR == 0) &&
    (treeNodes (Branch (Lf 1) 3 (Lf 1)) == 1) &&
    (treeNodes (Branch (Lf 1) 3 (Branch (Lf 2) 8 (Lf 2))) == 2) &&
    (treeNodes (Branch (Lf 1) 1 (Branch (Lf 2) 2 (Branch (Lf 3) 3 
       (Lf 3)))) == 3) &&
    (treeNodes (Branch (Branch (Lf 2) 1 (Lf 2)) 2 (Branch (Lf 2) 3 
       (Lf 2))) == 3)

找出所有内部节点:

内部节点就是除了根以外所有度数为1或者2的节点,这里要算上根

treeNodes :: BinTree a -> Int
treeNodes (Lf i) = 0
treeNodes (Branch left y right) = 1 + treeNodes left + treeNodes right

你可能感兴趣的:(学习)