一、树的概念
1.树的存储方式
顺序存储:将数据结构存储在固定的数据中,在遍历速度上有一定的优势,但因所占空间比较大,是非主流二叉树。二叉树通常以链式存储。
2.二叉树的概念
每个节点最多有两个子树的结构。通常子树被称为左子树和右子树。
3.二叉树的遍历
广度优先(层次遍历)
class Node(object):
def __init__(self,item):
self.elem=item
self.lchild=None
self.rchild=None
class Tree(object):
###二叉树
def __init__(self):
self.root=None
def add(self,item):
node=Node(item)
if self.root is None:
self.root=node
return
queue=[self.root]
while queue:
cur_node=queue.pop(0)
if cur_node.lchild is None:
cur_node.lchild=node
return
else:
queue.append(cur_node.lchild)
if cur_node.rchild is None:
cur_node.rchild=node
return
else:
queue.append(cur_node.rchild)
def breadth_travel(self):
####广度遍历
queue=[self.root]
if self.root is None:
return
while queue:
cur_node=queue.pop (0)
print(cur_node.elem,end='')
if cur_node.lchild is not None:
queue.append(cur_node.lchild)
if cur_node.rchild is not None:
queue.append(cur_node.rchild)
##深度遍历
def preorder(self,node):
##先序遍历
if node==None:
return
print(node.elem,end='')
self.preorder(node.lchild)
self.preorder(node.rchild)
def inorder(self, node):
##中序遍历
if node == None:
return
self.inorder(node.lchild)
print(node.elem, end='')
self.inorder(node.rchild)
def postorder(self, node):
##后序遍历
if node == None:
return
self.postorder(node.lchild)
self.postorder(node.rchild)
print(node.elem, end='')
if __name__=="__main__":
tree=Tree()
tree.add(0)
tree.add(1)
tree.add(2)
tree.add(3)
tree.add(4)
tree.add(5)
tree.add(6)
tree.add(7)
tree.add(8)
tree.add(9)
tree.breadth_travel()
print('')
tree.preorder(tree.root)
print('')
tree.inorder(tree.root)
print('')
tree.postorder(tree.root)
print('')
0123456789
0137849256
7381940526
7839415620
深度遍历
先序遍历
根节点–>左子树–.右子树
中序遍历
左子树–>根节点–>右子树
后序遍历
左子树–>右子树–>根节点
4.二叉树由遍历确定一棵树
必须有中序
先序+中序
后序+中序