判断一棵二叉树是不是另一棵的子结构
from collections import deque
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Tree(object):
def __init__(self):
self.root = None
def construct_tree(self, values=None):
if not values:
return None
self.root = TreeNode(values[0])
queue = deque([self.root])
leng = len(values)
nums = 1
while nums < leng:
node = queue.popleft()
if node:
node.left = TreeNode(values[nums]) if values[nums] else None
queue.append(node.left)
if nums + 1 < leng:
node.right = TreeNode(values[nums + 1]) if values[nums + 1] else None
queue.append(node.right)
nums += 1
nums += 1
def bfs(self):
ret = []
queue = deque([self.root])
while queue:
node = queue.popleft()
if node:
ret.append(node.val)
queue.append(node.left)
queue.append(node.right)
return ret
def pre_traversal(self):
ret = []
def traversal(head):
if not head:
return
ret.append(head.val)
traversal(head.left)
traversal(head.right)
traversal(self.root)
return ret
def in_traversal(self):
ret = []
def traversal(head):
if not head:
return
traversal(head.left)
ret.append(head.val)
traversal(head.right)
traversal(self.root)
return ret
def post_traversal(self):
ret = []
def traversal(head):
if not head:
return
traversal(head.left)
traversal(head.right)
ret.append(head.val)
traversal(self.root)
return ret
def sub_tree(tree1, tree2):
if tree1 and tree2:
if tree1.val == tree2.val:
return sub_tree(tree1.left, tree2.left) and sub_tree(tree1.right, tree2.right)
else:
return sub_tree(tree1.left, tree2) or sub_tree(tree1.right, tree2)
if not tree1 and tree2:
return False
return True
if __name__ == '__main__':
t1 = Tree()
t1.construct_tree([1, 2, 3, 4, 5])
print(t1.bfs())
t2 = Tree()
t2.construct_tree([2, 4, 5])
print(t2.bfs())
print(sub_tree(t1.root, t2.root))
结果展示:
[1, 2, 3, 4, 5]
[2, 4, 5]
True
——————————————————————————————————————————————————————————————————————————
求二叉树的镜像
思路一:按层次遍历,每一层从右到左
思路二:递归遍历
from collections import deque
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Tree(object):
def __init__(self):
self.root = None
def construct_tree(self, values=None):
if not values:
return None
self.root = TreeNode(values[0])
queue = deque([self.root])
leng = len(values)
nums = 1
while nums < leng:
node = queue.popleft()
if node:
node.left = TreeNode(values[nums]) if values[nums] else None
queue.append(node.left)
if nums + 1 < leng:
node.right = TreeNode(values[nums + 1]) if values[nums + 1] else None
queue.append(node.right)
nums += 1
nums += 1
def bfs(self):
ret = []
queue = deque([self.root])
while queue:
node = queue.popleft()
if node:
ret.append(node.val)
queue.append(node.left)
queue.append(node.right)
return ret
def mirror_bfs(root):
ret = []
queue = deque([root])
while queue:
node = queue.popleft()
if node:
ret.append(node.val)
queue.append(node.right)
queue.append(node.left)
return ret
def mirror_pre(root):
ret = []
def traversal(root):
if root:
ret.append(root.val)
traversal(root.right)
traversal(root.left)
traversal(root)
return ret
if __name__ == '__main__':
t = Tree()
t.construct_tree([1, 2, 3, 4, 5, 6, 7])
print(t.bfs())
print(mirror_bfs(t.root))
print(mirror_pre(t.root))
结果展示:
[1, 2, 3, 4, 5, 6, 7]
[1, 3, 2, 7, 6, 5, 4]
[1, 3, 7, 6, 2, 5, 4]
——————————————————————————————————————————————————————————————————————————
使用先序遍历和中序遍历的结果重建二叉树
from collections import deque
class TreeNode(object):
"""
二叉树结点定义
"""
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Tree(object):
"""
二叉树
"""
def __init__(self):
self.root = None
def bfs(self):
ret = []
queue = deque([self.root])
while queue:
node = queue.popleft()
if node:
ret.append(node.val)
queue.append(node.left)
queue.append(node.right)
return ret
def pre_traversal(self):
ret = []
def traversal(head):
if not head:
return
ret.append(head.val)
traversal(head.left)
traversal(head.right)
traversal(self.root)
return ret
def in_traversal(self):
ret = []
def traversal(head):
if not head:
return
traversal(head.left)
ret.append(head.val)
traversal(head.right)
traversal(self.root)
return ret
def post_traversal(self):
ret = []
def traversal(head):
if not head:
return
traversal(head.left)
traversal(head.right)
ret.append(head.val)
traversal(self.root)
return ret
def construct_tree(preorder=None, inorder=None):
"""
构建二叉树
"""
if not preorder or not inorder:
return None
index = inorder.index(preorder[0])
left = inorder[0:index]
right = inorder[index+1:]
root = TreeNode(preorder[0])
root.left = construct_tree(preorder[1:1+len(left)], left)
root.right = construct_tree(preorder[-len(right):], right)
return root
if __name__ == '__main__':
t = Tree()
root = construct_tree([1, 2, 4, 7, 3, 5, 6, 8], [4, 7, 2, 1, 5, 3, 8, 6])
t.root = root
print(t.bfs())
print (t.pre_traversal())
print (t.in_traversal())
print (t.post_traversal())
结果展示:
[1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 4, 7, 3, 5, 6, 8]
[4, 7, 2, 1, 5, 3, 8, 6]
[7, 4, 2, 5, 8, 6, 3, 1]
————————————————————————————————————————————————————————————————————————
二叉树的一个小应用:双向链表排序
将二叉搜索树转化成一个排序的双向链表,只调整树中结点的指向,不用新结点中序遍历,根结点的left指向左子树的最后一个(最大)值,right指向右子树的(最小)值
非二叉搜索树,建树的时候values中的顺序需要注意 之后有时间会改成二叉搜索树
from collections import deque
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Tree(object):
def __init__(self):
self.root = None
def construct_tree(self, values=None):
# 结点值不存在的话,values中用None表示
if not values:
return None
self.root = TreeNode(values[0])
queue = deque([self.root])
leng = len(values)
nums = 1
while nums < leng:
node = queue.popleft()
if node:
node.left = TreeNode(values[nums]) if values[nums] else None
queue.append(node.left)
if nums + 1 < leng:
node.right = TreeNode(values[nums + 1]) if values[nums + 1] else None
queue.append(node.right)
nums += 1
nums += 1
def bfs(self):
ret = []
queue = deque([self.root])
while queue:
node = queue.popleft()
if node:
ret.append(node.val)
queue.append(node.left)
queue.append(node.right)
return ret
class Solution(object):
@staticmethod
def convert(tree):
"""结点转换"""
if not tree:
return None
p_last = Solution.convert_nodes(tree, None)
while p_last and p_last.left: # 获取链表头结点
p_last = p_last.left
return p_last
@staticmethod
def convert_nodes(tree, last):
if not tree:
return None
if tree.left:
last = Solution.convert_nodes(tree.left, last)
if last:
last.right = tree
tree.left = last
last = tree
if tree.right:
last = Solution.convert_nodes(tree.right, last)
return last
@staticmethod
def print_nodes(tree):
# 正序链表打印
ret = []
while tree:
tmp = []
tmp.append(tree.left.val if tree.left else None)
tmp.append(tree.val)
tmp.append(tree.right.val if tree.right else None)
ret.append(tmp)
tree = tree.right
print(ret)
if __name__ == '__main__':
r = Tree()
r.construct_tree([3, 5, 4, 8, 6, None, 7, 1])
t = Solution.convert(r.root)
Solution.print_nodes(t)
网友评论