二叉树


Python & BinaryTree

1. BinaryTree (二叉树)

二叉树是有限个元素的集合,该集合或者为空、或者有一个称为根节点(root)的元素及两个互不相交的、分别被称为左子树和右子树的二叉树组成。

  • 二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
  • 二叉树的第i层至多有2^{i-1}个结点
  • 深度为k的二叉树至多有2^k-1个结点;
  • 对任何一棵二叉树T,如果其终端结点数为N0,度为2的结点数为N2,则N0=N2+1

 

2:二叉树遍历图解说明

前序遍历:根-左-右

 

 

 

 中序遍历:左-根-右 

 

 后序遍历:左-右-根 

 

 

3. 二叉树

这里写图片描述

  • 生成二叉树

 

# init a tree
def InitBinaryTree(dataSource, length):
    root = BTNode(dataSource[0])

    for x in xrange(1,length):
        node = BTNode(dataSource[x])
        InsertElementBinaryTree(root, node)
    return root
    print 'Done...'
  • 前根遍历
# pre-order
def PreorderTraversalBinaryTree(root):
    if root:
        print '%d | ' % root.data,
        PreorderTraversalBinaryTree(root.leftChild)
        PreorderTraversalBinaryTree(root.rightChild)
  • 中根遍历
# in-order
def InorderTraversalBinaryTree(root):
    if root:
        InorderTraversalBinaryTree(root.leftChild)
        print '%d | ' % root.data,
        InorderTraversalBinaryTree(root.rightChild)
  • 后根遍历
# post-order
def PostorderTraversalBinaryTree(root):
    if root:
        PostorderTraversalBinaryTree(root.leftChild)
        PostorderTraversalBinaryTree(root.rightChild)
        print '%d | ' % root.data,

 

  • 按层遍历
# layer-order
def TraversalByLayer(root, length):
    stack = []
    stack.append(root)
    for x in xrange(length):
        node = stack[x]
        print '%d | ' % node.data,
        if node.leftChild:
            stack.append(node.leftChild)
        if node.rightChild:
            stack.append(node.rightChild)

这里写图片描述

 

---------------------------------------------------二叉树树的思想重在“递归”, 并不是非要用递归处理,而是去理解二叉树递归的思想------------------------------------------------------------

  • 完整代码段
# -*- coding:utf-8 -*-

#################
### implement Binary Tree using python
### Hongwing
### 2016-9-4
#################

import math

class BTNode(object):
    """docstring for BTNode"""
    def __init__(self, data):
        self.data = data
        self.leftChild = None
        self.rightChild = None


# insert element 
def InsertElementBinaryTree(root, node):
    if root:
        if node.data < root.data:
            if root.leftChild:
                InsertElementBinaryTree(root.leftChild, node)
            else:
                root.leftChild = node
        else:
            if root.rightChild:
                InsertElementBinaryTree(root.rightChild, node)
            else:
                root.rightChild = node
    else:
        return 0

# init a tree
def InitBinaryTree(dataSource, length):
    root = BTNode(dataSource[0])

    for x in xrange(1,length):
        node = BTNode(dataSource[x])
        InsertElementBinaryTree(root, node)
    return root
    print 'Done...'

# pre-order
def PreorderTraversalBinaryTree(root):
    if root:
        print '%d | ' % root.data,
        PreorderTraversalBinaryTree(root.leftChild)
        PreorderTraversalBinaryTree(root.rightChild)

# in-order
def InorderTraversalBinaryTree(root):
    if root:
        InorderTraversalBinaryTree(root.leftChild)
        print '%d | ' % root.data,
        InorderTraversalBinaryTree(root.rightChild)

# post-order
def PostorderTraversalBinaryTree(root):
    if root:
        PostorderTraversalBinaryTree(root.leftChild)
        PostorderTraversalBinaryTree(root.rightChild)
        print '%d | ' % root.data,

# layer-order
def TraversalByLayer(root, length):
    stack = []
    stack.append(root)
    for x in xrange(length):
        node = stack[x]
        print '%d | ' % node.data,
        if node.leftChild:
            stack.append(node.leftChild)
        if node.rightChild:
            stack.append(node.rightChild)


if __name__ == '__main__':
    dataSource = [3, 4, 2, 6, 7, 1, 8, 5]
    length = len(dataSource)
    BTree = InitBinaryTree(dataSource, length)
    print '****NLR:'
    PreorderTraversalBinaryTree(BTree)
    print '\n****LNR'
    InorderTraversalBinaryTree(BTree)
    print '\n****LRN'
    PostorderTraversalBinaryTree(BTree)
    print '\n****LayerTraversal'
    TraversalByLayer(BTree, length)


--------------------------------------------------------------------------------------------------------------------------------------------------------

简单实现二叉树2(详细代码:https://github.com/201315060025/test/tree/master/data_structure_example)
#二叉树的节点
class Node(object): def __init__(self,data=None,l_child=None, r_child=None): self.data = data self.l_child = l_child self.r_child = r_child class B_Tree(object): def __init__(self, node=None): self.root = node def add(self, item=None): node = Node(item) #如果是空树,则直接添到根 if not self.root: self.root = node else: #不为空,则按照 左右顺序 添加节点,这样构建出来的是一棵有序二叉树,且是完全二叉树 my_queue = [] my_queue.append(self.root) while True: cur_node = my_queue.pop(0) if not cur_node.l_child: cur_node.l_child = node return elif not cur_node.r_child: cur_node.r_child = node return else: my_queue.append(cur_node.l_child) my_queue.append(cur_node.r_child)
  

if __name__ == __main__:
  data_list = [2,1,3,5,4.6]
  tree =
B_Tree()
for dt in data_list:
tree.add(dt)
 
 
 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM