二叉树

python实现二叉树

前言

由于python的基本变量类型中没有二叉树类型,因此要使用python实现二叉树的相关操作需要先自定义二叉树类型及相关操作,本文记述在python3环境中构建二叉树的操作过程和说明。

Concept

定义

Binary Tree——A binary tree is a tree data structure where each node has up to two child nodes, creating the branches of the tree. The two children are usually called the left and right nodes. Parent nodes are nodes with children, while child nodes may include references to their parents.

Binary trees are used to implement binary search trees and binary heaps. They are also often used for sorting data as in a heap sort.
二叉树常被用于实现二叉查找树和二叉堆。

二叉树是每个结点最多有两个子树的树结构。它有五种基本形态:二叉树可以是空集;根可以有空的左子树或右子树;或者左、右子树皆为空。
二叉树的五种基本形态

性质

  • 在非空二叉树中,第i层的结点总数不超过 2(i1) 2 ( i − 1 ) , i>=1;
  • 深度为h的二叉树最多有 2(h1) 2 ( h − 1 ) 个结点(h>=1),最少有h个结点;
  • 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N2,则N0=N2+1;
  • 具有n个结点的完全二叉树的深度为 [log2n]+1 [ l o g 2 n ] + 1 (注:[ ]表示向下取整)
  • 有N个结点的完全二叉树各结点如果用顺序方式存储,则结点之间有如下关系:
    若I为结点编号则 如果I>1,则其父结点的编号为I/2;
    如果2*I<=N,则其左儿子(即左子树的根结点)的编号为2*I;若2*I>N,则无左儿子;
    如果2*I+1<=N,则其右儿子的结点编号为2*I+1;若2*I+1>N,则无右儿子。
  • 给定N个节点,能构成h(N)种不同的二叉树。
    h(N)为卡特兰数的第N项。h(n)=C(2*n,n)/(n+1)。
  • 设有i个枝点,I为所有枝点的道路长度总和,J为叶的道路长度总和J=I+2i [4]
    由于python的基本变量类型中没有二叉树类型,因此要使用python实现二叉树的相关操作需要先自定义二叉树类

思路

定义二叉树节点类TreeNode,包含三个属性:值,左子节点,右子节点。
- val:表示本节点的值,字符、数字或其他类型都可以,在定义本节点时传入;
- left:表示本节点的左子节点,可以为空或节点,初值为None;
- right:表示本节点的右子树,可以为空或节点,初值为None;

代码

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

前序遍历

定义

前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树。

若二叉树为空则结束返回,否则:
1. 访问根结点。
2. 前序遍历左子树。
3. 前序遍历右子树 。


前序遍历数组=>二叉树

给定前序遍历的序列数组,由该数组生成一个二叉树
思路
递归


def make_a_Binary_Tree_by(li):
    if li[0]!=None:
        node = TreeNode(li.pop(0))
        node.left=make_a_Binary_Tree_by(li)
        node.right=make_a_Binary_Tree_by(li)
    else:
        return li.pop(0)
    return node

二叉树=>前序遍历数组

给一个二叉树,求出该二叉树的前序遍历序列
思路
递归


def preorder_traversal(root):
    li=[]
    if root!=None:
        li+=[root.val]
        li+=preorder_traversal(root.left)
        li+=preorder_traversal(root.right)
    else:
        return []
    return li

测试代码

#coding utf-8
#144. Binary Tree Preorder Traversal
class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None
def make_a_Binary_Tree_by(li):
    if li[0]!=None:
        node = TreeNode(li.pop(0))
        node.left=make_a_Binary_Tree_by(li)
        node.right=make_a_Binary_Tree_by(li)
    else:
        return li.pop(0)
    return node
def preorder_traversal(root):
    li=[]
    if root!=None:
        li+=[root.val]
        li+=preorder_traversal(root.left)
        li+=preorder_traversal(root.right)
    else:
        return []
    return li
def main():
    l = [10, 7, 4,None,None, 9,None,None, 13, None, 15,None,None]
    root=make_a_Binary_Tree_by(l)
    print('\t\t',root.val)
    print('\t',root.left.val,'\t\t  ',root.right.val)
    print(' ',root.left.left.val,'   ',root.left.right.val,' ',root.right.left,'  ',root.right.right.val)
    print(preorder_traversal(root))
if __name__ == '__main__':
    main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值