二叉树

#-*- coding:utf-8 -*-
"""
二叉树:二叉树是由n(n≥0)个结点组成的有限集合、每个结点最多有两个子树的有序树。它或者是空集,或者是由
        一个根和称为左、右子树的两个不相交的二叉树组成。
特点:
(1)二叉树是有序树,即使只有一个子树,也必须区分左、右子树;
(2)二叉树的每个结点的度不能大于2,只能取0、1、2三者之一;
(3)二叉树中所有结点的形态有5种:空结点、无左右子树的结点、只有左子树的结点、只有右子树的结点
     和具有左右子树的结点。
"""
# 二叉树的基本结构
class BinTNode:
    def __init__(self,dat,left=None,right=None):
        self.data = dat
        self.left = left
        self.right = right

class Btree(object):
    def __init__(self,root = 0):
        self.root = root


t = BinTNode(1,BinTNode(2),BinTNode(3))
# 基于BinTNode构造的二叉树具有递归结构,很容易采用递归的方式处理;
# 统计树中节点的个数
def count_BinTNodes(t):
    if t is None:
        return 0
    else:
        return 1+count_BinTNodes(t.left)+count_BinTNodes(t.right)
# 假设节点中都有数值,求所有节点的数值的和
def sum_BinTNodes(t):
    if t is None:
        return 0
    else:
        return t.dat + sum_BinTNodes(t.left) + sum_BinTNodes(t.right)

# 遍历算法
"""
深度遍历算法:包括中序遍历、先序遍历、后续遍历
广度遍历算法
"""

#先序
def preOrder(t, proc):
    if t is 0:
        return
    proc(t.data)
    preOrder(t.left)
    preOrder(t.right)

#中序
def inOrder(t, proc):
    if t is 0:
        return
    inOrder(t.left)
    proc(t.data)
    inOrder(t.right)

#后序
def postOrder(t, proc):
    if t is 0:
        return
    inOrder(t.left)
    inOrder(t.right)
    proc(t.data)

#求最大树深
def maxDepth(t):
if not t:
return 0
else:
return max(maxDepth(t.left),maxDepth(t.right))+1

#求两棵树是否相同
def isSameTree(p, q):
if p == None and q == None:
return True
elif p and q :
return p.val == q.val and isSameTree(p.left,q.left) and isSameTree(p.right,q.right)
else :
return False
 

 

posted on 2018-09-11 18:22  欢喜等大年  阅读(92)  评论(0编辑  收藏  举报

导航