From 362fec607e57bba06b925aebd3c170bba21b8d66 Mon Sep 17 00:00:00 2001 From: Sakshi Agrawal <66746828+SakshiiAgrawal@users.noreply.github.com> Date: Tue, 20 Oct 2020 08:53:41 +0530 Subject: [PATCH 1/2] zigzag traversal of a binary tree (#48) The idea is to use two stacks. We can use one stack for printing from left to right and other stack for printing from right to left. In every iteration, we have nodes of one level in one of the stacks. We print the nodes, and push nodes of next level in other stack. --- Trees/zigzagtraversal_iterative.py | 75 ++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 Trees/zigzagtraversal_iterative.py diff --git a/Trees/zigzagtraversal_iterative.py b/Trees/zigzagtraversal_iterative.py new file mode 100644 index 0000000..fa485b3 --- /dev/null +++ b/Trees/zigzagtraversal_iterative.py @@ -0,0 +1,75 @@ +class Node: + """ + A Node has data variable and pointers to its left and right nodes. + """ + + def __init__(self, data): + self.left = None + self.right = None + self.data = data + +def make_tree() -> Node: + root = Node(1) + root.left = Node(2) + root.right = Node(3) + root.left.left = Node(4) + root.left.right = Node(5) + return root + +def zigzag_iterative(root: Node): + """ + ZigZag traverse by iterative method: Print node left to right and right to left, alternatively. + """ + if root == None: + return + + # two stacks to store alternate levels + s1 = [] # For levels to be printed from right to left + s2 = [] # For levels to be printed from left to right + + # append first level to first stack 's1' + s1.append(root) + + # Keep printing while any of the stacks has some nodes + while not len(s1) == 0 or not len(s2) == 0: + + # Print nodes of current level from s1 and append nodes of next level to s2 + while not len(s1) == 0: + temp = s1[-1] + s1.pop() + print(temp.data, end = " ") + + # Note that is left is appended before right + if temp.left: + s2.append(temp.left) + if temp.right: + s2.append(temp.right) + + # Print nodes of current level from s2 and append nodes of next level to s1 + while not len(s2) == 0: + temp = s2[-1] + s2.pop() + print(temp.data, end = " ") + + # Note that is rightt is appended before left + if temp.right: + s1.append(temp.right) + if temp.left: + s1.append(temp.left) + +def main(): # Main function for testing. + """ + Create binary tree. + """ + root = make_tree() + print("\nZigzag order traversal(iterative) is: ") + zigzag_iterative(root) + print() + + +if __name__ == "__main__": + import doctest + + doctest.testmod() + main() + From c95666d39c198e90800c0c3d943aeaf958c6a0a2 Mon Sep 17 00:00:00 2001 From: Juzar Bharmal <53657281+Juzar10@users.noreply.github.com> Date: Tue, 26 Jan 2021 21:08:54 +0530 Subject: [PATCH 2/2] fixed one sided binary tree issue (#51) --- Trees/BinarySearchTree.py | 34 ++++++++++++++++++++++++++++------ 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/Trees/BinarySearchTree.py b/Trees/BinarySearchTree.py index 2b6333a..ea0e15a 100644 --- a/Trees/BinarySearchTree.py +++ b/Trees/BinarySearchTree.py @@ -44,23 +44,45 @@ def minValueNode(self, node): return current - def delete(self, data): + def maxValueNode(self, node): + current = node + + # loop down to find the leftmost leaf + while(current.rightChild is not None): + current = current.rightChild + + return current + + + def delete(self, data,root): ''' For deleting the node ''' if self is None: return None # if current node's data is less than that of root node, then only search in left subtree else right subtree if data < self.data: - self.leftChild = self.leftChild.delete(data) + self.leftChild = self.leftChild.delete(data,root) elif data > self.data: - self.rightChild = self.rightChild.delete(data) + self.rightChild = self.rightChild.delete(data,root) else: # deleting node with one child if self.leftChild is None: + + if self == root: + temp = self.minValueNode(self.rightChild) + self.data = temp.data + self.rightChild = self.rightChild.delete(temp.data,root) + temp = self.rightChild self = None return temp elif self.rightChild is None: + + if self == root: + temp = self.maxValueNode(self.leftChild) + self.data = temp.data + self.leftChild = self.leftChild.delete(temp.data,root) + temp = self.leftChild self = None return temp @@ -69,7 +91,7 @@ def delete(self, data): # first get the inorder successor temp = self.minValueNode(self.rightChild) self.data = temp.data - self.rightChild = self.rightChild.delete(temp.data) + self.rightChild = self.rightChild.delete(temp.data,root) return self @@ -128,7 +150,7 @@ def insert(self, data): def delete(self, data): if self.root is not None: - return self.root.delete(data) + return self.root.delete(data,self.root) def find(self, data): if self.root: @@ -189,4 +211,4 @@ def postorder(self): print('\n\nAfter deleting 10') tree.delete(10) tree.inorder() - tree.preorder() + tree.preorder() \ No newline at end of file