class
Node:
def
__init__(
self
, data
=
None
, left
=
None
,
right
=
None
):
self
.data
=
data
self
.right
=
right
self
.left
=
left
maxLen
=
30
segtree
=
[
0
]
*
(maxLen
*
4
)
def
buildTree(l , r ,i , arr):
global
segtree
global
maxLen
if
(l
=
=
r) :
segtree[i]
=
l
return
l
l1
=
buildTree(l,
int
((l
+
r)
/
2
),
2
*
i
+
1
, arr)
r1
=
buildTree(
int
((l
+
r)
/
2
)
+
1
,r,
2
*
i
+
2
, arr)
if
(arr[l1] > arr[r1]):
segtree[i]
=
l1
else
:
segtree[i]
=
r1
return
segtree[i]
def
rangeMax(l, r, rl, rr, i, arr):
global
segtree
global
maxLen
if
(r < rl
or
l > rr):
return
-
1
if
(l >
=
rl
and
r <
=
rr):
return
segtree[i]
l1
=
rangeMax(l,
int
((l
+
r)
/
2
), rl,
rr,
2
*
i
+
1
, arr)
r1
=
rangeMax(
int
((l
+
r)
/
2
)
+
1
, r, rl,
rr,
2
*
i
+
2
, arr)
if
(l1
=
=
-
1
):
return
r1
if
(r1
=
=
-
1
):
return
l1
if
(arr[l1] > arr[r1]):
return
l1
else
:
return
r1
def
inorder(curr):
if
(curr
=
=
None
):
return
inorder(curr.left)
print
(curr.data, end
=
" "
)
inorder(curr.right)
def
createCartesianTree(l , r , arr, n):
if
(r < l):
return
None
m
=
rangeMax(
0
, n
-
1
, l, r,
0
, arr)
curr
=
Node(arr[m])
curr.left
=
createCartesianTree(l, m
-
1
, arr, n)
curr.right
=
createCartesianTree(m
+
1
, r, arr, n)
return
curr
arr
=
[
8
,
11
,
21
,
100
,
5
,
70
,
55
]
n
=
len
(arr)
buildTree(
0
, n
-
1
,
0
, arr)
inorder(createCartesianTree(
0
, n
-
1
, arr, n))