Python实现二叉树相关算法

绝地灬酷狼 2022-03-07 14:30 289阅读 0赞

节点定义

  1. class Node(object):
  2. def __init__(self, left_child, right_child, value):
  3. self._left_child = left_child
  4. self._right_child = right_child
  5. self._value = value
  6. @property
  7. def left_child(self):
  8. return self._left_child
  9. @property
  10. def right_child(self):
  11. return self._right_child
  12. @left_child.setter
  13. def left_child(self, value):
  14. self._left_child = value
  15. @right_child.setter
  16. def right_child(self, value):
  17. self._right_child = value
  18. @property
  19. def value(self):
  20. return self._value
  21. @value.setter
  22. def value(self, value):
  23. self._value = value

二叉树定义

  1. class Tree(object):
  2. def __init__(self, value):
  3. self._root = Node(None, None, value=value)
  4. @property
  5. def root(self):
  6. return self._root

先序遍历

递归方式

  1. '''
  2. 先序遍历,递归方式
  3. '''
  4. def preoder(root):
  5. if not isinstance(root, Node):
  6. return None
  7. preorder_res = []
  8. if root:
  9. preorder_res.append(root.value)
  10. preorder_res += preoder(root.left_child)
  11. preorder_res += preoder(root.right_child)
  12. return preorder_res

非递归方式

  1. '''
  2. 先序遍历,非递归方式
  3. '''
  4. def pre_order_not_recursion(root):
  5. if not isinstance(root, Node):
  6. return None
  7. stack = [root]
  8. result = []
  9. while stack:
  10. node = stack.pop(-1)
  11. if node:
  12. result.append(node.value)
  13. stack.append(node.right_child)
  14. stack.append(node.left_child)
  15. return result

中序遍历

递归方式

  1. '''
  2. 中序遍历,递归方式
  3. '''
  4. def middle_order(root):
  5. if not isinstance(root, Node):
  6. return None
  7. middle_res = []
  8. if root:
  9. middle_res += middle_order(root.left_child)
  10. middle_res.append(root.value)
  11. middle_res += middle_order(root.right_child)
  12. return middle_res

非递归方式

  1. '''
  2. 中序遍历,非递归方式
  3. '''
  4. def middle_order_bot_recursion(root):
  5. if not isinstance(root, Node):
  6. return None
  7. result = []
  8. stack = [root.right_child, root.value, root.left_child]
  9. while stack:
  10. temp = stack.pop(-1)
  11. if temp:
  12. if isinstance(temp, Node):
  13. stack.append(temp.right_child)
  14. stack.append(temp.value)
  15. stack.append(temp.left_child)
  16. else:
  17. result.append(temp)
  18. return result

后序遍历

递归方式

  1. '''
  2. 后序遍历,递归方式
  3. '''
  4. def post_order(root):
  5. if not isinstance(root, Node):
  6. return None
  7. post_res = []
  8. if root:
  9. post_res += post_order(root.left_child)
  10. post_res += post_order(root.right_child)
  11. post_res.append(root.value)
  12. return post_res

非递归方式

  1. '''
  2. 后序遍历,非递归方式
  3. '''
  4. def post_order_not_recursion(root):
  5. if not isinstance(root, Node):
  6. return None
  7. stack = [root.value, root.right_child, root.left_child]
  8. result = []
  9. while stack:
  10. temp_node = stack.pop(-1)
  11. if temp_node:
  12. if isinstance(temp_node, Node):
  13. stack.append(temp_node.value)
  14. stack.append(temp_node.right_child)
  15. stack.append(temp_node.left_child)
  16. else:
  17. result.append(temp_node)
  18. return result

分层遍历

  1. '''
  2. 分层遍历,使用队列实现
  3. '''
  4. def layer_order(root):
  5. if not isinstance(root, Node):
  6. return None
  7. queue = [root.value, root.left_child, root.right_child]
  8. result = []
  9. while queue:
  10. temp = queue.pop(0)
  11. if temp:
  12. if isinstance(temp, Node):
  13. queue.append(temp.value)
  14. queue.append(temp.left_child)
  15. queue.append(temp.right_child)
  16. else:
  17. result.append(temp)
  18. return result

计算二叉树结点个数

  1. '''
  2. 计算二叉树结点个数,递归方式
  3. NodeCount(root) = NodeCount(root.left_child) + NodeCount(root.right_child)
  4. '''
  5. def node_count(root):
  6. if root and not isinstance(root, Node):
  7. return None
  8. if root:
  9. return node_count(root.left_child) + node_count(root.right_child) + 1
  10. else:
  11. return 0
  12. '''
  13. 计算二叉树结点个数,非递归方式
  14. 借用分层遍历计算
  15. '''
  16. def node_count_not_recursion(root):
  17. if root and not isinstance(root, Node):
  18. return None
  19. return len(layer_order(root))

计算二叉树深度

  1. '''
  2. 计算二叉树深度,递归方式
  3. tree_deep(root) = 1 + max(tree_deep(root.left_child), tree_deep(root.right_child))
  4. '''
  5. def tree_deep(root):
  6. if root and not isinstance(root, Node):
  7. return None
  8. if root:
  9. return 1 + max(tree_deep(root.left_child), tree_deep(root.right_child))
  10. else:
  11. return 0
  12. '''
  13. 计算二叉树深度,非递归方法
  14. 同理参考分层遍历的思想
  15. '''
  16. def tree_deep_not_recursion(root):
  17. if root and not isinstance(root, Node):
  18. return None
  19. result = 0
  20. queue = [(root, 1)]
  21. while queue:
  22. temp_node, temp_layer = queue.pop(0)
  23. if temp_node:
  24. queue.append((temp_node.left_child, temp_layer+1))
  25. queue.append((temp_node.right_child, temp_layer+1))
  26. result = temp_layer + 1
  27. return result-1

计算二叉树第k层节点个数

  1. '''
  2. 计算二叉树第k层节点个数,递归方式
  3. kth_node_count(root, k) = kth_node_count(root.left_count, k-1) + kth_node_count(root.right_count, k-1)
  4. '''
  5. def kth_node_count(root, k):
  6. if root and not isinstance(root, Node):
  7. return None
  8. if not root or k <= 0:
  9. return 0
  10. if k == 1:
  11. return 1
  12. return kth_node_count(root.left_child, k-1) + kth_node_count(root.right_child, k-1)
  13. '''
  14. 计算二叉树第K层节点个数,非递归方式
  15. '''
  16. def kth_node_count_not_recursion(root, k):
  17. if root and not isinstance(root, Node):
  18. return None
  19. if not root or k <= 0:
  20. return 0
  21. if k == 1:
  22. return 1
  23. queue = [(root, 1)]
  24. result = 0
  25. while queue:
  26. temp_node, temp_layer = queue.pop(0)
  27. if temp_node:
  28. if temp_layer == k:
  29. result += 1
  30. elif temp_layer > k:
  31. return result
  32. else:
  33. queue.append((temp_node.left_child, temp_layer+1))
  34. queue.append((temp_node.right_child, temp_layer+1))
  35. return result

计算二叉树叶子节点个数

  1. '''
  2. 计算二叉树叶子节点个数,递归方式
  3. 关键点是叶子节点的判断标准,左右孩子皆为None
  4. '''
  5. def leaf_count(root):
  6. if root and not isinstance(root, Node):
  7. return None
  8. if not root:
  9. return 0
  10. if not root.left_child and not root.right_child:
  11. return 1
  12. return leaf_count(root.left_child) + leaf_count(root.right_child)

判断两个二叉树是不是相同

  1. '''
  2. 判断两个二叉树是不是相同,递归方式
  3. isSame(root1, root2) = (root1.value == root2.value)
  4. and isSame(root1.left, root2.left)
  5. and isSame(root1.right, root2.right)
  6. '''
  7. def is_same_tree(root1, root2):
  8. if not root1 and not root2:
  9. return True
  10. if root1 and root2:
  11. return (root1.value == root2.value) and \
  12. is_same_tree(root1.left_child, root2.left_child) and \
  13. is_same_tree(root1.right_child, root2.right_child)
  14. else:
  15. return False

判断是否为二分查找树BST

  1. '''
  2. 判断是否为二分查找树BST,递归方式
  3. 二分查找树的定义搞清楚,二分查找树的中序遍历结果为递增序列
  4. '''
  5. def is_bst_tree(root):
  6. if root and not isinstance(root, Node):
  7. return None
  8. def is_asc(order):
  9. for i in range(len(order)-1):
  10. if order[i] > order[i+1]:
  11. return False
  12. return True
  13. return is_asc(middle_order_bot_recursion(root))

测试方法

  1. if __name__ == "__main__":
  2. tree = Tree(1)
  3. tree1 = Tree(1)
  4. node6 = Node(None, None, 7)
  5. node5 = Node(None, None, 6)
  6. node4 = Node(None, None, 5)
  7. node3 = Node(None, None, 4)
  8. node2 = Node(node5, node6, 3)
  9. node1 = Node(node3, node4, 2)
  10. tree.root.left_child = node1
  11. tree.root.right_child = node2
  12. tree1.root.left_child = node2
  13. tree1.root.right_child = node2
  14. print(is_bst_tree(tree.root))

发表评论

表情:
评论列表 (有 0 条评论,289人围观)

还没有评论,来说两句吧...

相关阅读

    相关 相关算法题思想

    二叉树是面试经常会考到的一个知识点,关于二叉树延伸的应用也很广泛。二叉树的核心是递归,但我们在遇到二叉树相关的问题时,如果纠结于递归这个点,很可能陷进去,毕竟人的大脑装不下那么

    相关 的创建和相关算法

    ![Center][] 二叉树是一种非常重要的数据结构,它是分支结构的基础,今天本人将写一篇博客来叙述一下其相关的算法以及二叉树的创建过程! 1:二叉树的创建: 主要有

    相关 iOS 相关算法实现

    什么是二叉树? 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”和“右子树”,左子树和右子树同时也是二叉树。二叉树的子树有左右之分,并且次