树是一种基本的“非线性”数据结构
数据结构树分为:根、枝和叶三个部分
-
节点Node:是组成树的基本部分,每个节点具有名称或“键值”
-
边Edge:边是组成树的另一个基本部分
-
根Root:树中唯一一个没有入边的节点
-
路径Path:由边依次连接在一起的节点的有序列表
-
层级Level:从根节点开始到达一个节点的路径,包含的边的数量称为这个节点的层级
-
高度:树中所有节点的最大层级称为树的高度
若树的每个节点最多只能有两个子节点,则该树称为二叉树。二叉树的遍历方式有三种,可通过迭代和循环的方式实现:
- 前序遍历(先访问根节点,再访问左子节点,最后访问右子节点)
- 中序遍历(先访问左子节点,再访问根节点,最后访问右子节点)
- 后序遍历(先访问左子节点,再访问右子节点,最后访问根节点)
python BinaryTree类的实现(包括前中后序遍历以及树的高度)
class BinaryTree:
def __init__(self, rootObj):
self.key = rootObj
self.leftChild = None
self.rightChild = None
def insertLeft(self, newNode):
if not self.leftChild:
self.leftChild = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.left = self.leftChild
self.leftChild = t
def insertRight(self, newNode):
if not self.rightChild:
self.rightChild = BinaryTree(newNode)
else:
t = BinaryTree(newNode)
t.right = self.rightChild
self.rightChild = t
def isLeaf(self):
return (not self.leftChild) and (not self.rightChild)
def getLiftChild(self):
return self.leftChild
def getRightChild(self):
return self.rightChild
def setRootVal(self,obj):
self.key = obj
def getRootVal(self):
return self.key
def inorder(self):
if self.leftChild:
self.leftChild.inorder()
print(self.key)
if self.rightChild:
self.rightChild.inorder()
def postorder(self):
if self.leftChild:
self.rightChild.postorder()
if self.rightChild:
self.rightChild.postorder()
print(self.key)
def preorder(self):
print(self.key)
if self.leftChild:
self.leftChild.preorder()
if self.rightChild:
self.rightChild.preorder()
def height(tree):
if tree is None:
return -1
else:
return 1 + max(height(tree.leftChild),height(tree.rightChild))
测试用例
t = BinaryTree(7)
t.insertLeft(3)
l = t.getLiftChild()
l.insertLeft(3)
t.insertRight(9)
t.inorder()
print(height(t))
输出
3
3
7
9
2