[Daily Coding Problem 24] Implement locking in a binary tree
This problem was asked by Google. Implement locking in a binary tree. A binary tree node can be locked or unlocked only if all of its descendants or ancestors are not locked. Design a binary tree node class with the following methods:
You may augment the node to add parent pointers or any other property you would like. You may assume the class is used in a single-threaded program,so there is no need for actual locks or mutexes. Each method should run in O(h),where h is the height of the tree. ? Solution 1. is_locked(): O(1) lock(): O(m + h) unlock(): O(m + h)
1 public class BinaryTreeWithLock { 2 private class BinaryTreeNode { 3 boolean locked; 4 BinaryTreeNode parent; 5 BinaryTreeNode leftChild; 6 BinaryTreeNode rightChild; 7 } 8 9 public boolean is_locked(BinaryTreeNode node) { 10 return node.locked; 11 } 12 public boolean lock(BinaryTreeNode node) { 13 if(!checkLockPrecondition(node)) { 14 return false; 15 } 16 node.locked = true; 17 return true; 18 } 19 public boolean unlock(BinaryTreeNode node) { 20 if(!checkLockPrecondition(node)) { 21 return false; 22 } 23 node.locked = false; 24 return true; 25 } 26 private boolean checkLockPrecondition(BinaryTreeNode node) { 27 //check descendants 28 boolean left = checkChildLockPrecondition(node.leftChild); 29 if(!left) { 30 return false; 31 } 32 boolean right = checkChildLockPrecondition(node.rightChild); 33 if(!right) { 34 return false; 35 } 36 //check ancestors 37 BinaryTreeNode parentNode = node.parent; 38 while(parentNode != null) { 39 if(parentNode.locked) { 40 return false; 41 } ? Solution 2 with O(n) lock and unlock Since solution 1 does not meet the O(h) requirement,we can improve the performance of lock and unlock by?adding another field to the node that keeps tracks of the count of locked descendants. That way,we can immediately see whether any of its descendants are locked. This will reduce our?
1 public class BinaryTreeWithLock { 2 private class BinaryTreeNode { 3 int val; 4 boolean locked = false; 5 BinaryTreeNode parent; 6 BinaryTreeNode leftChild; 7 BinaryTreeNode rightChild; 8 int lockedDescendantCount = 0; 9 } 10 11 public boolean is_locked(BinaryTreeNode node) { 12 return node.locked; 13 } 14 public boolean lock(BinaryTreeNode node) { 15 if(is_locked(node)) { 16 return true; 17 } 18 if(!canLockOrUnlock(node)) { 19 return false; 20 } 21 node.locked = true; 22 BinaryTreeNode parentNode = node.parent; 23 while(parentNode != null) { 24 parentNode.lockedDescendantCount += 1; 25 parentNode = parentNode.parent; 26 } 27 return true; 28 } 29 public boolean unlock(BinaryTreeNode node) { 30 if(!is_locked(node)) { 31 return true; 32 } 33 if(!canLockOrUnlock(node)) { 34 return false; 35 } 36 node.locked = false; 37 BinaryTreeNode parentNode = node.parent; 38 while(parentNode != null) { 39 parentNode.lockedDescendantCount -= 1; 40 parentNode = parentNode.parent; 41 } 42 return true; 43 } 44 private boolean canLockOrUnlock(BinaryTreeNode node) { 45 if(node.lockedDescendantCount > 0) { 46 return false; 47 } 48 BinaryTreeNode parentNode = node.parent; 49 while(parentNode != null) { 50 if(parentNode.locked) { 51 return false; 52 } 53 parentNode = parentNode.parent; 54 } 55 return true; 56 } 57 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |