forked from tearf001/Training-Python-Public
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBiTree3.py
More file actions
109 lines (96 loc) · 3.15 KB
/
BiTree3.py
File metadata and controls
109 lines (96 loc) · 3.15 KB
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
'''
题目1:给定二叉树的前序和中序遍历结果,需要输出后序遍历结果
题目2:需要进一步求出给定2个节点的最近公共祖先节点
'''
import re
class Node(object):
"""节点类"""
def __init__(self, elem=-1, lchild=None, rchild=None):
self.elem = elem
self.lchild = lchild
self.rchild = rchild
def __repr__(self):
ret = '(%s<-%s->%s)' % (self.lchild, self.elem, self.rchild)
ret = ret.replace('None<-', '')
ret = ret.replace('->None', '')
ret = re.sub(r'\((\d+)\)', r'\1', ret)
return ret
def buildTree(preOrder, inOrder):
if not preOrder:
return
root = preOrder[0]
index = inOrder.index(root)
ltreeInOrder = inOrder[:index]
ltreePreOrder = preOrder[1:index+1]
rtreeInOrder = inOrder[index+1:]
rtreePreOrder = preOrder[index+1:]
# print(root, ltreeInOrder, rtreeInOrder)
# print(root, ltreePreOrder, rtreePreOrder)
ltree = buildTree(ltreePreOrder, ltreeInOrder)
rtree = buildTree(rtreePreOrder, rtreeInOrder)
return Node(root, ltree, rtree)
def later_rec(root):
if root == None:
return
later_rec(root.lchild)
later_rec(root.rchild)
postOrderList.append(root.elem)
def _checkNodeInBiTree(root, a):
if not root:
return False
if root.elem == a:
return True
return _checkNodeInBiTree(root.lchild, a) or _checkNodeInBiTree(root.rchild, a)
def searchList(root, a, b):
return _checkNodeInBiTree(root, a) and _checkNodeInBiTree(root, b)
def findNearestPreNode_Rec(root, a, b):
node = root
while node:
if searchList(node.lchild, a, b):
node = node.lchild
elif searchList(node.rchild, a, b):
node = node.rchild
else:
return node.elem
class MyStack(list):
def push(self, x):
self.append(x)
def pull(self):
self.pop()
def _searchStack(root, item, myStack):
if not root:
return False
myStack.push(root.elem)
if root.elem == item:
return True
if (not _searchStack(root.lchild, item, myStack)) \
and (not _searchStack(root.rchild, item, myStack)):
myStack.pop()
return False
else:
return True
def findNearestPreNode_Stack(root, a, b):
myStack1, myStack2 = MyStack(), MyStack()
_searchStack(root, 6, myStack1)
_searchStack(root, 8, myStack2)
# print(myStack1, myStack2)
stackList = [i for i,j in zip(myStack1, myStack2) if i==j]
# print(stackList)
return stackList[-1]
if __name__ == '__main__':
# preOrder = open('preOrder.txt').read().split(',')
preOrder = '1,2,4,7,3,5,8,9,6'.split(',')
preOrder = list(map(int, preOrder))
# inOrder = open('inOrder.txt').read().split(',')
inOrder = '4,7,2,1,8,5,9,3,6'.split(',')
inOrder = list(map(int, inOrder))
# print(preOrder, inOrder)
root = buildTree(preOrder, inOrder)
print(root)
postOrderList = []
later_rec(root)
postOrder = ','.join(map(str, postOrderList))
print(postOrder)
# print(_checkNodeInBiTree(root, 6))
print(findNearestPreNode_Rec(root, 6, 8))
print(findNearestPreNode_Stack(root, 6, 8))