Python实现二叉树及其4种遍历

Python & BinaryTree

1. BinaryTree (二叉树)

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

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

2. 二叉树


  • 生成二叉树
# 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)
    • Result 
  • 二叉树的思想重在“递归”, 并不是非要用递归处理,而是去理解二叉树递归的思想


    • 完整代码段
    # -*- 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)
    
    
时间: 2024-10-13 05:14:44

Python实现二叉树及其4种遍历的相关文章

关于二叉树的几种遍历方法

转载请注明出处 http://blog.csdn.net/pony_maggie/article/details/38390513 作者:小马 一 二叉树的一些概念 二叉树就是每个结点最多有两个子树的树形存储结构.先上图,方便后面分析. 1 满二叉树和完全二叉树 上图就是典型的二叉树,其中左边的图还叫做满二叉树,右边是完全二叉树.然后我们可以得出结论,满二叉树一定是完全二叉树,但是反过来就不一定.满二叉树的定义是除了叶子结点,其它结点左右孩子都有,深度为k的满二叉树,结点数就是2的k次方减1.完

二叉树的三种遍历方式的循环和递归的实现方式

///////////////////头文件:BST.h//////////////////////// #ifndef BST_H #define BST_H #include "StdAfx.h" #include<iostream> #include<stack> template<typename DataType> class BST { public: class Node { public: Node(int data=0):m_dat

二叉树的三种遍历简单版

同学突然向我问二叉树的三种遍历代码.数据结构刚刚学了,自己很吃力的敲了出来. 和老师演示的代码有很大差距. #include <stdio.h>#include <string.h>#include <stdlib.h> #define Error -1#define Right 1 struct BiTnode{    char data;    struct BiTnode *LChild;    struct BiTnode *RChild; }; BiTnode

公交车站捡垃圾之二叉树的三种遍历方法

# 二叉树的遍历 今天下午看了二叉树的三种遍历方式,虽然能写出代码,但是理解可能不太到位,感觉很容易忘,所以想到一个形象的方法,把每个节点当作公交车站,而访问节点则是在这个公交车站捡垃圾,右子树和左子树则表示岔路.然后这个捡垃圾的人钟爱左边这个方向,所以一直以左优先.甲乙丙三个人,都爱捡垃圾,但是思考方式不同,所以捡垃圾的方法有点不同. 先序遍历 先序遍历最简单,秉承的原则是,甲很小心谨慎,每次经过公交车站,怕别人捡了,都把垃圾先捡到手,直到左边的路走完了,再往回走,但是回来的过程中,在公交车站

二叉树的四种遍历方式

二叉树的四种遍历方式: 二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次.四种遍历方式分别为:先序遍历.中序遍历.后序遍历.层序遍历. 遍历之前,我们首先介绍一下,如何创建一个二叉树,在这里博主宝宝用的是先建左树在建右树的方法, 首先要声明结点TreeNode类,代码如下: public class TreeNode { public int data; public TreeNode le

PTA 二叉树的三种遍历(先序、中序和后序)

6-5 二叉树的三种遍历(先序.中序和后序) (6 分) 本题要求实现给定的二叉树的三种遍历. 函数接口定义: void Preorder(BiTree T); void Inorder(BiTree T); void Postorder(BiTree T); T是二叉树树根指针,Preorder.Inorder和Postorder分别输出给定二叉树的先序.中序和后序遍历序列,格式为一个空格跟着一个字符. 其中BinTree结构定义如下: typedef char ElemType; typed

POJ2255 TreeRecovery(二叉树的三种遍历)

Description Little Valentine liked playing with binary trees very much. Her favorite game was constructing randomly looking binary trees with capital letters in the nodes. This is an example of one of her creations: D / \ B E / \ \ A C G / F To recor

根据二叉树的两种遍历求二叉树的结构

二叉树的前序遍历顺序是:根节点,左树,右树 中序遍历顺序是:左树,根节点,右树 后序遍历顺序是:左树,右树,根节点 上面这棵树的前序遍历是:abfcjm   中序遍历是:fbcamj  后序遍历是:fcbmja 根据前序遍历和后序遍历是不能求出树的唯一结构的, 已知的两种遍历顺序必须必须包括中序遍历,因为中序遍历能够递归的推出根节点的左树和右树 如上题已知   前序遍历是:abfcjm   中序遍历是:fbcamj  那么根据前序遍历就可以知道树根是a, 再根据中序遍历就可以知道以a为根节点左树

二叉树的三种遍历(非递归)

先定义二叉树: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ 二叉树的先序遍历(以LeetCode 144.为例): class Solution { public: vector<int> preo