1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| ''' 有10台电脑,1-2、2-4、3-5、4-7、5-8、6-9、6-10、连接
问:2-7、5-9之间是否联通?
解决思路:1、把10台电脑视为10个集合, 2、在一条线上,视为集合作了 并 运算。 3、两个点是否在一条线上,转化为了两个点是否在一个集合内。
这样 两步骤算法 "并" "查"。 可以用树来表示集合,树的结点代表集合的元素。 用树根root来代表某一个集合。
"双亲"表示法 ---- 每个孩子指向双亲。 可以不用链表 用数组就能存储,(静态链表)表示。 (静态链表) 可参考《13二叉树同构》
但是双亲表示法的指向不一样,一个结点只有一个指针,都是只指向父结点,
2 {4 6 8} 1 {3 5 7 9}
''' class Node(): def __init__(self,data=None,parent=None): self.data = data self.parent = parent class Tree(): def __init__(self,maxsize=10): print('最大10个元素。') self.s = [None] * maxsize self.maxsize = maxsize self.address = 0 def add(self,item,item_parent): self.s[self.address] = (Node(item,item_parent)) self.address += 1
def find(self,x): i = 0 while i < self.address and self.s[i].data != x: i += 1 if i >= self.address: return -1,'没找到' while self.s[i].parent >= 0: i = self.s[i].parent return i
tree = Tree() tree.add(4,1) tree.add(10,-1)
tree.add(6,1) tree.add(8,1)
tree.add(9,-1) tree.add(3,4) tree.add(5,4) tree.add(7,4)
t3 = tree.find(3) print(t3) t5 = tree.find(5) print(t5) t6 = tree.find(6) print(t6) t21 = tree.find(21) print(t21)
|