完全二叉树的定义是只有最后一行可以不是满的,这一行的所有节点均是从左往右放置的。
现在大部分算法都是BFS的层次遍历,有没有递归的方法的呢?
现在找到的比较接近的递归算法是这样的
1 bool isFullTree(tree *T) 2 { 3 if(T!==NULL){ 4 if(T->rchild!=NULL&&T->lchild==NULL) 5 return false; 6 isFullTree(T->lchild); 7 isFullTree(T->rchild); 8 } 9 return true; 10 }
但是这里的有一个反例,如果是一个深度为3的二叉树,最后一行的2个节点全部在右侧,左侧那棵树在最后一行没有节点的时候,这个算法依旧会判断为完全二叉树。
求解如何修正。
哪有什么2个节点全在右侧?
深度为3的二叉树,第三行不是可以有四个叶子节点吗,然后这行只有右边子树有2个叶子节点,左边没有,用这个算法也会判断成完全二叉树。
@sean10:
1 1-1 1-2 1-1-1 1-1-2 1-2-1 1-2-2 你说情况是,1-1有子节点1-2有值但没有子节点?
上面的递归算法没有最后一层的逻辑。他判断的只是左右情况,而算法要求是实现最后一层的左右情况
如果不是最后一层,需要验证左右都有值,你要改的话就加一个判断下层的逻辑,
@吴瑞祥: 不是,不过我想了一下,确实递归不能实现,完全二叉树的结构就不是分形的,需要判断层次,那就不是纯递归了。谢谢~
其实是可以递归判断的,分情况讨论:
class Solution:
def isCompleteTree(self, root: TreeNode) -> bool:
from dataclasses import dataclass
@dataclass
class Info:
height: int
is_full: bool
is_cbt: bool
def dfs(x):
if not x: return Info(0, True, True)
l, r = dfs(x.left), dfs(x.right)
height = max(l.height, r.height) + 1
is_full = l.is_full and r.is_full and l.height == r.height
is_cbt = is_full \
or l.is_full and r.is_full and l.height - 1 == r.height \
or l.is_full and r.is_cbt and l.height == r.height \
or l.is_cbt and r.is_full and l.height - 1 == r.height
return Info(height, is_full, is_cbt)
return dfs(root).is_cbt
还有另一种根据节点数判断的方法,可以见 LeetCode 958,都是这个解法