Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 740374c

Browse files
Threaded tree in Python
1 parent 069c043 commit 740374c

File tree

1 file changed

+195
-0
lines changed

1 file changed

+195
-0
lines changed

‎Trees/threaded-tree.py

Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
# Copyright (C) Deepali Srivastava - All Rights Reserved
2+
# This code is part of DSA course available on CourseGalaxy.com
3+
4+
class Node:
5+
def __init__(self,value):
6+
self.info = value
7+
self.left = None
8+
self.right = None
9+
self.leftThread = True
10+
self.rightThread = True
11+
12+
13+
class ThreadedBinaryTree:
14+
15+
def __init__(self):
16+
self.root = None
17+
18+
19+
def _inorderPredecessor(self, p):
20+
if p.leftThread == True:
21+
return p.left
22+
else:
23+
p = p.left
24+
while p.rightThread == False:
25+
p = p.right
26+
return p
27+
28+
29+
def _inorderSuccessor(self, p):
30+
if p.rightThread == True:
31+
return p.right
32+
else:
33+
p = p.right
34+
while p.leftThread == False:
35+
p = p.left
36+
return p
37+
38+
39+
def inorder(self):
40+
if self.root == None:
41+
print("Tree is empty")
42+
return
43+
44+
#Find the leftmost node of the tree
45+
p = self.root
46+
while p.leftThread == False:
47+
p = p.left
48+
49+
while p!=None:
50+
print(p.info, end = " ")
51+
if p.rightThread == True:
52+
p = p.right
53+
else:
54+
p = p.right
55+
while p.leftThread == False:
56+
p = p.left
57+
print()
58+
59+
60+
def insert(self, x):
61+
p = self.root
62+
par = None
63+
64+
while p!=None :
65+
par = p
66+
if x < p.info:
67+
if p.leftThread == False:
68+
p = p.left
69+
else:
70+
break
71+
elif x > p.info:
72+
if p.rightThread == False:
73+
p = p.right
74+
else:
75+
break
76+
else:
77+
print(x , " already present in the tree")
78+
return
79+
80+
temp = Node(x)
81+
if par == None:
82+
self.root = temp
83+
elif x < par.info: #inserted as left child
84+
temp.left = par.left
85+
temp.right = par
86+
par.leftThread = False
87+
par.left = temp
88+
else: #inserted as right child
89+
temp.left = par
90+
temp.right = par.right
91+
par.rightThread = False
92+
par.right = temp
93+
94+
def delete(self, x):
95+
p = self.root
96+
par = None
97+
98+
while p != None:
99+
if x == p.info:
100+
break
101+
par = p
102+
if x < p.info:
103+
if p.leftThread == False:
104+
p = p.left
105+
else:
106+
break
107+
else:
108+
if p.rightThread == False:
109+
p = p.right
110+
else:
111+
break
112+
113+
if p == None or p.info != x:
114+
print(x , " not found")
115+
return
116+
117+
118+
if p.leftThread == False and p.rightThread == False: #Case C: 2 children
119+
#Find inorder successor and its parent
120+
ps = p
121+
s = p.right
122+
123+
while s.leftThread == False:
124+
ps = s
125+
s = s.left
126+
127+
p.info = s.info
128+
p = s
129+
par = ps
130+
131+
132+
#Case A : No child
133+
if p.leftThread == True and p.rightThread == True:
134+
if par == None:
135+
self.root = None
136+
elif p == par.left:
137+
par.leftThread = True
138+
par.left = p.left
139+
else:
140+
par.rightThread = True
141+
par.right = p.right
142+
return
143+
144+
#Case B : 1 child
145+
if p.leftThread == False: #node to be deleted has left child
146+
ch = p.left
147+
else: #node to be deleted has right child
148+
ch = p.right
149+
150+
if par == None: #node to be deleted is root node
151+
self.root = ch
152+
elif p == par.left: #node is left child of its parent
153+
par.left = ch
154+
else: #node is right child of its parent
155+
par.right = ch
156+
157+
pred = self._inorderPredecessor(p)
158+
succ = self._inorderSuccessor(p)
159+
160+
if p.leftThread == False: #if p has left child, right is a thread
161+
pred.right = succ
162+
else: #p has right child,left is a thread
163+
succ.left = pred
164+
165+
166+
167+
168+
##############################################################################################
169+
170+
171+
if __name__ == '__main__':
172+
173+
tree = ThreadedBinaryTree()
174+
175+
while True:
176+
print("1.Insert a new node")
177+
print("2.Delete a node")
178+
print("3.Inorder Traversal")
179+
print("4.Quit")
180+
choice = int(input("Enter your choice : "))
181+
182+
if choice == 1:
183+
x = int(input("Enter the key to be inserted : "))
184+
tree.insert(x)
185+
elif choice == 2:
186+
x = int(input("Enter the element to be deleted : "))
187+
tree.delete(x)
188+
elif choice == 3:
189+
tree.inorder()
190+
elif choice == 4:
191+
break
192+
else:
193+
print("Wrong choice")
194+
print()
195+

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /