用Python代码判断一棵树是否为完全二叉树。
时间: 2023-06-07 22:08:21 浏览: 143
可以使用层次遍历方法对二叉树进行遍历,在遍历的过程中,对于每一个节点,记录它的编号。对于编号为i的节点,如果它有左孩子,那么左孩子的编号就是2*i,如果它有右孩子,那么右孩子的编号就是2*i+1。如果一个节点的编号不是2*i或2*i+1,那么它就不是完全二叉树。以下是Python代码:
```
def isCompleteBinaryTree(root):
if not root:
return True
queue = [(root, 1)]
count = 1
while queue:
node, num = queue.pop(0)
if num != count:
return False
count += 1
if node.left:
queue.append((node.left, 2*num))
if node.right:
queue.append((node.right, 2*num+1))
return True
```
在这段代码中,queue中存储每个节点以及它的编号,count表示当前处理到的节点的编号。对于每个节点,将它的左孩子和右孩子加入到queue中。当queue为空时,遍历结束,如果遍历到的节点编号不连续,那么它就不是完全二叉树。
相关问题
python设计算法判断一棵树是否为完全二叉树附带测试结果
好的,我明白了。针对您的问题,可以利用完全二叉树的性质进行判断。完全二叉树的性质包括:除了最底层节点外,其余层节点数都要达到最大值,最底层上的节点集中在树的左边连续位置上。具体的算法实现如下:
1.对树进行层序遍历(BFS),同时记录每个节点的编号。
2.如果当前节点没有右子节点但是有左子节点(左枝膀不空,右枝膀空了),那么就不是完全二叉树。
3.如果当前节点的编号为i(从1开始),但左子节点的编号不为2i,那么也不是完全二叉树。
4.如果当前节点的编号为i(从1开始),右子节点的编号不为2i+1,也不是完全二叉树。
5.如果上述情况都没有出现,则为完全二叉树。
下面是实现的Python代码,并且附带了一组测试结果:
```python
class Node:
def __init__(self, val=None, left=None, right=None):
self.val = val
self.left = left
self.right = right
def isCompleteTree(root: Node) -> bool:
if not root:
return True
nodes = [(root, 1)]
i = 0
while i < len(nodes):
curr_node, curr_idx = nodes[i]
i += 1
if curr_node:
nodes.append((curr_node.left, curr_idx*2))
nodes.append((curr_node.right, curr_idx*2+1))
return nodes[-1][1] == len(nodes)
# testing
root1 = Node(1, Node(2, Node(4), Node(5)), Node(3, Node(6)))
root2 = Node(1, Node(2, Node(4), Node(5)), Node(3))
root3 = Node(1, Node(2, Node(4)), Node(3, Node(5), Node(6)))
print(isCompleteTree(root1)) # True
print(isCompleteTree(root2)) # True
print(isCompleteTree(root3)) # False
```
希望这个代码对您有所帮助!
判断一棵树是否为完全二叉树python算法及主程序
以下是判断一棵树是否为完全二叉树的 Python 算法和主程序:
```python
# 定义树的节点
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 定义判断是否为完全二叉树的函数
def isCompleteTree(root):
if not root:
return True
queue = [root]
is_end = False
while queue:
node = queue.pop(0)
if not node:
is_end = True
elif is_end:
return False
else:
queue.append(node.left)
queue.append(node.right)
return True
# 主程序
# 定义树的节点,这里以完全二叉树为例
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)
root.right.left = TreeNode(6)
root.right.right = TreeNode(7)
if isCompleteTree(root):
print("这棵树是完全二叉树")
else:
print("这棵树不是完全二叉树")
```
以上代码中,isCompleteTree() 函数的实现思路是使用 BFS 广度优先搜索遍历树的节点,并判断节点是否存在子节点,以此来判断该树是否为完全二叉树。主程序中构造了一棵完全二叉树作为例子,在函数调用完成后输出结果。
阅读全文