--- æ´æ° `2017-03-22` --- çæ§äºå¥½ä¹ çäºåæ ï¼ç»äºå¨è¿ä¸¤å¤©å¼æäºãäºåæ³æ¥æ¾å·²å¨åå 天宿ï¼ç£¨åééåçªç¾ï¼å¼å¼å¼ï¼ ä½ä¸ºäºåæ ï¼æç §æç®åçç解就æ¯ç±»ä¼¼äºååçæ ï¼æ å¹²ä¸å两个åæè ä¸ä¸ª(ä¸ååçæ çä¸å°æä½ç¨å¤)ï¼ååçå°æ¹ç§°ä¸º**èç¹**ãç¶ååç两个ååå¯ä»¥ç»§ç»åæ 干䏿 ·ååï¼æ°åçåæå¯ä»¥ç»§ç»ååï¼ååçåï¼ååçåï¼æ ç©·å°½ä¹ï¼ä½æ¯**æ ç左边çåçå¼å°äºèç¹å¼ï¼å³è¾¹ç大äºèç¹å¼**ã æ¬æåèï¼ [èé½çGithub](https://github.com/qiwsir/algorithm/blob/master/binary_tree.md) é¦å ï¼å»ºç«ä¸æ£µæ ã ```python class Node: def __init__(self, data): self.left = None self.right = None self.data = data ``` è¿æ ·ï¼å ç§ç§çå°æ èå°±ç§å¥½äºãæ¥çå°±æ¯èé¿çé¿å¦ãæµæ°´å»å½ï¼ ```python class Nodeï¼ ''' ... ''' def insert(self, data): if data < self.data: # æ åå°äºèç¹ if self.left is None: # å¹¶ä¸å·¦é¢çæ å为空 self.left = Node(data) # å½ä»ä¸è®©çæå ¥ else: # é空çè¯ self.left.insert(data) # 以左æ å为èç¹ç»§ç»æå ¥ elif data > self.data: if self.right is None: self.right = Node(data) else: self.right.insert(data) else: self.data = data ``` æµå®æ°´åï¼å°æ èååçå¾ä¸çªåã ```python class Nodeï¼ ''' çç¥ä¸è¿°ä»£ç ''' def search(self, data, parent=None): ''' dataä¸ºç®æ æ¥è¯¢å¼ï¼åæ¶è¿åparent(ç¶èç¹)便äºå®ä½ã ''' if data < self.data: if self.left is None: return None, None else: return self.left.search(data, self) elif data > self.data: if self.right is None: return None, None return self.right.search(data, self) else: # return self.data, parent.data return self, parent ``` æ èçé¿çé£ä¹å¥½ï¼æ³ççæ¯ä¸ªåä¸é½æ¯å¥åï¼æ¥æ¥æ¥ï¼æ¬å¤´å¾ä¸ç((å ¶å®æ¯å¾ä¸çå¦)ã ```python def print_tree(self): if self.left: self.left.print_tree() print(self.data) if self.right: self.right.print_tree() ``` æ çéååå为以ä¸ä¸ç§ï¼ 1. ååº(root -> left -> right) 2. ä¸åº(left -> root -> right) 3. ååº(left -> right -> root) è°æ´`print_tree`彿°é `print(self.data)` ç顺åºå³å¯å®ç°ä¸ç§éåæ¹å¼ã 转ç¼é´å°æ èæ¶¨ç太æºçäºï¼ç¯æ¶¨åï¼ï¼æä¹åå¢ï¼åªå 个æå§ã嫿ªæå¦ï¼å°æ èï¼ å é¤èç¹æ¶ï¼æä¸ç§å¯è½çæ åµï¼ 1. ç®æ èç¹ä¸æ²¡æä»»ä½èç¹(0个) 2. ç®æ èç¹ä¸æä¸ä¸ªèç¹ 3. ç®æ èç¹ä¸æä¸¤ä¸ªèç¹ å¤æèç¹æ°ç®ç¨åºå¦ä¸ï¼ ```python class Nodeï¼ ''' çç¥ä»£ç ''' def chrildren(self): count = 0 if self.left: count += 1 if self.right: count += 1 return count ``` æ¥ä¸æ¥å°±æ¯å 餿ä½å¦ãå¦å¼å¼ã ```python class Nodeï¼ ''' çç¥ ''' def delete(self, data): node, parent = self.search(data) chrildren = node.chrildren() # åèç¹æ°ç® if chrildren == 0: # æ åµ 1ï¼ æ²¡æåèç¹ï¼ç´æ¥å é¤å³å¯ if parent.left is node: # å¤æç®æ èç¹æ¯å ¶ç¶èç¹ç å·¦orå³ èç¹ parent.left = None else: parent.right = None del node elif chrildren == 1: # æ åµ 2ï¼ æä¸ä¸ªåèç¹ï¼ç¨åèç¹æ¿æ¢å ¶å³å¯ if node.left: tmp = node.left else: tmp = node.right if parent: if parent.left is node: parent.left = tmp else: parent.right = tmp del node else: ''' 第ä¸ç§æ 嵿¯è¾å¤æï¼ 1\. å·¦èç¹0个åèç¹ 2\. å·¦èç¹1个åèç¹ 3\. å·¦èç¹2个åèç¹ ''' parent = node successor = node.right while successor.left: # é彿æ³ï¼ç´è³æ¾å°'æå·¦'çåèç¹ï¼ ä¿ææ ç平衡ï¼ç¨å³åèç¹ç弿¿æ¢ parent = successor successor = successor.left node.data = successor.data if parent.left == successor: parent.left = successor.right else: parent.right = successor.right # æ¥ä¸æ¥å¯ä»¥æµè¯ä»¥ä¸ç§çæ æä¹æ ·å¦ã root = Node(11) root.insert(14) root.insert(9) root.insert(9) root.insert(7) root.insert(10) root.insert(4) root.insert(5) root.insert(6) root.insert(8) value, parent = root.search(10) print(value.data, parent.data) root.print_tree() print('_'_ 20) root.delete(4) root.print_tree() ``` æèªå·±çè§£çé¨ååäºåãå½åç»ä¹ ï¼å°±å å½ä¸ªÎ±çå§ã `2016-05-28` åºæ¬ææç½äº 宿´ä»£ç [å¨è¿é](https://github.com/lambdaplus/python/blob/master/binary_tree.py) ### 广度éååæ·±åº¦éåäºåæ ï¼ ```python def lookup(root): stack = [root] while stack: current = stack.pop() print(current.data) if current.left: stack.append(current.left) if current.right: stack.append(current.right) def deep(root): if not root: return deep(root.left) deep(root.right) print(root.data) ``` ### æ±æå¤§æ æ·± ```python # -*- coding:utf-8 -*- class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: def TreeDepth(self, pRoot): if not pRoot: return 0 return max(self.TreeDepth(pRoot.left), self.TreeDepth(pRoot.right)) + 1 ``` ### æ¯è¾ä¸¤æ£µæ æ¯å¦ç¸å ```python def is_same(t1, t2): if t1 == None and t2 == None: return True elif t1 and t2: return t1.data == t2.data and is_same(t1.left, t2.left)\ and is_same(t1.right, t2.right) else: return False ``` ### å·²ç¥ååºä¸åºæ±ååº åé¢è¯´å°ï¼ ååº: root -> left -> right ä¸åº: left -> root -> right ååº: left -> right -> root ååº: 第ä¸ä¸ªå¼ A å³ä¸ºæ ¹èç¹ ä¸åº: A çå·¦è¾¹å ¨ä¸ºå·¦åæ ï¼å³è¾¹å ¨æ¯å³åæ ```python def pre_in_post(pre_order, in_order): if not pre_order: return post = Node(pre_order[0]) index = in_order.index(pre_order[0]) post.left = pre_in_post(pre_order[1:index+1], in_order[:index]) post.right = pre_in_post(pre_order[index+1:], in_order[index+1:]) return post ``` ### å·²ç¥ååºä¸åºæé åºæ ```python # -*- coding:utf-8 -*- class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None class Solution: # è¿åæé çTreeNodeæ ¹èç¹ def reConstructBinaryTree(self, pre, tin): # write code here if not pre: return tree = TreeNode(pre[0]) index = tin.index(pre[0]) tree.left = self.reConstructBinaryTree(pre[1:index+1],tin[:index]) tree.right = self.reConstructBinaryTree(pre[index+1:],tin[index+1:]) return tree @classmethod def print_tree(cls, tree): if tree: cls.print_tree(tree.left) cls.print_tree(tree.right) print(tree.val) pre = [1,2,3,4,5,6,7] tin = [3,2,4,1,6,5,7] s = Solution() t = s.reConstructBinaryTree(pre, tin) s.print_tree(t) ``` ### æ çåç»æ ```python æ±pRoot2 çåæ æ¯å¦ä¸º pRoot2 # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def is_subtree(self, t1, t2): if not t2: # t2 is None å ¶ä¸ºåæ return True if not t1: return False if not t1.val == t2.val: return False return self.is_subtree(t1.left, t2.left) and self.is_subtree(t1.right, t2.right) def HasSubtree(self, pRoot1, pRoot2): # write code here result = False if pRoot1 and pRoot2: if pRoot1.val == pRoot2.val: result = self.is_subtree(pRoot1, pRoot2) if not result: result = self.is_subtree(pRoot1.left, pRoot2) if not result: result = self.is_subtree(pRoot1.right, pRoot2) return result ``` ### 对称äºåæ ``` # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: def isSymmetrical(self, pRoot): def is_same(p1, p2): if not (p1 or p2): return True elif p1 and p2 and p1.val == p2.val: return is_same(p1.left, p2.right) and is_same(p1.right, p2.left) return False if not pRoot: return True return is_same(pRoot.left, pRoot.right) ``` ### äºåæ éå ``` # -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution: # è¿åéåæ çæ ¹èç¹ def Mirror(self, root): # write code here if not root: return None elif not (root.left or root.right): return root root.left, root.right = root.right, root.left if root.left: self.Mirror(root.left) if root.right: self.Mirror(root.right) ```