二叉树的实现
二叉树的结点
1 2 3 4 5 class treeNode (): def __init__ (self, value=None ): self.data = value self.left = None self.right = None
和单链表结点差不多,不过都设置成了公有变量。
二叉树的定义
构造函数
1 2 3 4 5 class Tree (): def __init__ (self ): self.__root = treeNode() self.__root.left = None self.__root.right = None
定义了二叉树的根结点,以及它的左右子树。初始的根结点的值为0,但是本身是存在的。
基本函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 def setRoot (self, root ): self.__root = root def addToLeft (self, root, treeNode ): root.left = treeNode def addToRight (self, root, treeNode ): root.right = treeNode def getRoot (self ): return self.__root def size (self ): p, l, cnt = None , [self.__root], 0 while l: p = l.pop() cnt += 1 if p.left: l.append(l.left) if p.right: l.append(l.right) return cnt
size()
用来计算整个树的结点个数,这里使用迭代的方法,没有用递归。
层次遍历
1 2 3 4 5 6 7 8 9 10 11 12 def hierTraverse (self ): if not self.__root.data: return None arr, l = [], [self.__root] while l: p = l.pop(0 ) arr.append(p.data) if p.left: l.append(p.left) if p.right: l.append(p.right) return arr
从数组建立与可视化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 def establishFromList (self, arr ): if not arr: return else : p, l, i, res = None , [self.__root], 0 , [] length = len (arr) while l: p = l.pop(0 ) if arr[i] == '*' : i += 1 if i == length: break else : p.data = arr[i] i += 1 if i == length: break p.left, p.right = treeNode(), treeNode() l.append(p.left) l.append(p.right) res.append(p) while (res): p = res.pop() if not p.left.data: p.left = None if not p.right.data: p.right = None def display (self ): arr = [] if not self.__root.data: return arr def traverseHelper (level, node ): data = node.data if node else '*' if len (arr) <= level: arr.append([data]) else : arr[level].append(data) if not node: return traverseHelper(level+1 , node.left) traverseHelper(level+1 , node.right) traverseHelper(0 , self.__root) for i in range (len (arr)-1 ): for j in range (len (arr[i])): if arr[i][j] == '*' : arr[i+1 ].insert(j*2 , '*' ) arr[i+1 ].insert(j*2 , '*' ) return arr[0 :-1 ]
establishFromList()
从数组建立二叉树,*
代表左/右子树为空,整个二叉树的层次遍历和数组一致。display()
用来进行可视化,返回二维数组,外层数组的元素为每层的遍历结果,空的部分用*
表示。每层的元素个数为2^n
。
前中后序遍历
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 def firstTraverse (self ): if not self.__root.data: return [] arr = [] def helper (root ): if not root: return arr.append(root.data) helper(root.left) helper(root.right) helper(self.__root) return arr def firstTraverseNR (self ): if not self.__root.data: return [] arr, stack = [], [self.__root] while stack: node = stack.pop() arr.append(node.data) if node.right: stack.append(node.right) if node.left: stack.append(node.left) return arr def middleTraverse (self ): if not self.__root.data: return [] arr = [] def helper (root ): if not root: return helper(root.left) arr.append(root.data) helper(root.right) helper(self.__root) return arr def middleTraverseNR (self ): if not self.__root.data: return [] arr, stack, node = [], [], self.__root while stack or node: while node: stack.append(node) node = node.left node = stack.pop() arr.append(node.data) node = node.right return arr def postTraverse (self ): if not self.__root.data: return [] arr = [] def helper (root ): if not root: return helper(root.left) helper(root.right) arr.append(root.data) helper(self.__root) return arr def postTraverseNR (self ): if not self.__root.data: return [] arr, stack = [], [self.__root] while stack: node = stack.pop() arr.append(node.data) if node.left: stack.append(node.left) if node.right: stack.append(node.right) return arr[::-1 ]
每一种遍历都使用了递归和非递归(NR)
方法实现。前序遍历的非递归方法有两种思路。后序遍历的非递归实现取巧采用中右左
的倒序进行输出。
其他做题的时候遇到的函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 def getHeight (self ): if not self.__root.data: return 0 def helper (root, height ): if not root: return height return max (helper(root.left, height+1 ), helper(root.right, height+1 )) return helper(self.__root, 0 ) def longestPath (self ): if not self.__root.data: return 0 def helper (root, length ): if not root: return length return max (helper(root.left, length+1 ), helper(root.right, length+1 )) return 1 +helper(self.__root.left, 0 )+helper(self.__root.right, 0 ) def switch (self ): if not self.__root.data: return def helper (root ): if not root: return root.left, root.right = root.right, root.left if root.left: helper(root.left) if root.right: helper(root.right) helper(self.__root)
getHeight()
返回数的高度,longestPath()
返回树中的最长路径,switch
让左右子树递归交换(相当于沿着中轴线对称)。
测试代码
最后是测试代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 def testTree (): tree = Tree() tree.establishFromList([1 , 2 , 3 , '*' , 4 , 5 , '*' , 6 , 7 , 8 ]) print (tree.hierTraverse()) print (tree.display()) print (tree.firstTraverse()) print (tree.firstTraverseNR()) print (tree.middleTraverse()) print (tree.middleTraverseNR()) print (tree.postTraverse()) print (tree.postTraverseNR()) print (tree.getHeight()) print (tree.longestPath()) tree.switch() print (tree.display())