Python --- 二叉树的层序建立与三种遍历

二叉树(Binary Tree)时数据结构中一个非常重要的结构,其具有。。。。(此处省略好多字)。。。。等的优良特点。

之前在刷LeetCode的时候把有关树的题目全部跳过了,(ORZ:我这种连数据结构都不会的人刷j8Leetcode啊!!!)

所以 !!!敲黑板了!!!今天我就在B站看了数据结构中关于树的内容后,又用我浅薄的Python大法来实现一些树的建立和遍历。



关于树的建立我觉得层序建立对于使用者来说最为直观,输入很好写。(好吧,我是看LeetCode中的树输入都是采用层序输入觉得非常好)

树节点定义

代码来

class BSTreeNode(object):
    def __init__(self, data):
        self.val = data
        self.leftChild = None
        self.rightChild = None

这一段代码太好理解了好吧,就不BB了。

二叉树层序建立

不多说,先上代码

 1 # 建立二叉树是以层序遍历方式输入,节点不存在时以 ‘None‘ 表示
 2 def creatTree(nodeList):
 3     if nodeList[0] == None:
 4         return None
 5     head = BSTreeNode(nodeList[0])
 6     Nodes = [head]
 7     j = 1
 8     for node in Nodes:
 9         if node != None:
10             node.leftChild = (BSTreeNode(nodeList[j]) if nodeList[j] != None else None)
11             Nodes.append(node.leftChild)
12             j += 1
13             if j == len(nodeList):
14                 return head
15             node.rightChild = (BSTreeNode(nodeList[j])if nodeList[j] != None else None)
16             j += 1
17             Nodes.append(node.rightChild)
18             if j == len(nodeList):
19                 return head

creatTree即为层序建立二叉树的函数,传入的参数为一个层序遍历的数组,就是将树节点从左往右,从上往下一次放入数组中,如果某个节点不存在则用None来表示。

比如:

图所示的二叉树则需输入a = [1,2,3,4,5,None,6,None,None,7,8],接下来将会以这个二叉树为例讲解代码。

  • 第3-4行,判断根节点是否为空。 如果根节点都为空,那树(shuo)就(ge)不(j)存(8)在了,直接返回就好了。
  • 第5行,将元素列表中的第一个元素取出新建根节点,最后返回的即为根节点
  • 第6行,创建了一个Nodes列表中,用于存放树中的节点,每生成一个节点就将其放入该列表中,可以看成是一个队列(这么说好像也不是特别规范,因为后面只是取列表中的元素,没有弹出首元素),此处将根节点存入。
  • 第7行,创建变量j用于nodeList中元素的索引,初始为1.因为第0个元素已经创建根节点了。
  • 第8行,依次取出Nodes列表中的节点,对其创建左子节点和右子节点
  • 第9行,首先判断取出的Nodes是否为空,如果为空,说明此处没有节点,就无需创建子节点,否则进行子节点的创建
  • 第10行,为该节点创建左节点,其值就是索引j的所对应的值,如果nodeLists[j] == None 说明没有该子节点,就不用创建了,即Child = None
  • 第11行,将新建的节点加入Nodes数组,使其在for循环中可以继续为其添加子节点
  • 第12行,j加1,这样刚好使每一个nodeList的元素对应一个节点了
  • 第13行,判断j的值,如果与nodeList值相等说明全部节点已经添加完毕了,直接返回head根节点就完成了树的建立
  • 第15-19行,为节点添加右节点,与添加左节点的逻辑是一样的,就不在赘述了

好了代码注释完毕,我们再通过结合实例来解释一下:

  •  nodeList = [1,2,3,4,5,None,6,None,None,7,8],下面节点统一用n(值)来表示
  • 建立根节点 head = n(1), j=1, len(nodeList) = 11
  • 开始for循环:Nodes = [n(1)]
    • node为n(1),非空

      • nodeList[j]=nodeList[1]=2 非空,所以新建节点n(2),n(1)的左节点即为n(2),新建节点放入Nodes, 则Nodes=[n(1),n(2)] j+1=2, j未溢出
      • nodeList[j]=nodeList[2]=3 非空,所以新建节点n(3),n(1)的右节点即为n(3),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3)], 然后j+1=3, j未溢出
    • node为n(2),非空
      • nodeList[j]=nodeList[3]=4 非空,所以新建节点n(4),n(2)的左节点即为n(4),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4)], j+1=4, j未溢出
      • nodeList[j]=nodeList[4]=5 非空,所以新建节点n(5),n(2)的右节点即为n(5),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5)], j+1=5, j未溢出
    • node为n(3),非空
      • nodeList[j]=nodeList[5]=None 为空,所以n(3)的左节点直接等于None, 同时将None也放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None] j+1=6, j未溢出
      • nodeList[j]=nodeList[6]=6 非空,所以新建节点n(6),n(3)的右节点即为n(6),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6)], j+1=7, j未溢出 
    • node为n(4),非空
      • nodeList[j]=nodeList[7]=None 为空,所以n(4)的左节点直接等于None,同时将None也放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None], j+1=8, j未溢出
      • nodeList[j]=nodeList[8]=None 为空,所以n(4)的右节点直接等于None,同时将None也放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None], j+1=9, j未溢出
    • node为n(5), 非空
      • nodeList[j]=nodeList[9]=7 非空,所以新建节点n(7),n(5)的左节点即为n(7),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None,n(9)] j+1=10, j未溢出
      • nodeList[j]=nodeList[10]=8 非空,所以新建节点n(8),n(5)的右节点即为n(8),新建节点放入Nodes, 则Nodes=[n(1),n(2),n(3),n(4),n(5),None,n(6),None,None,n(9),n(10)] j+1=11, j溢出
  • j溢出,则返回head根节点,结束二叉树的建立

  PS:如果node为空节点的话,就会直接跳过空节点。

二叉树遍历(神用的递归)

1. 前序遍历

#head为二叉树的根节点
def PreorderTraverse(head):
    if head:
        print(head.val)
        PreorderTraverse(head.leftChild)
        PreorderTraverse(head.rightChild)

2. 中序遍历

#head为二叉树的根节点
def InorderTrverse(head):
    if head:
        InorderTrverse(head.leftChild)
        print(head.val)
        InorderTrverse(head.rightChild)

3. 后续遍历

#head为二叉树的根节点
def PostorderTraverse(head):
    if head:
        PostorderTraverse(head.leftChild)
        PostorderTraverse(head.rightChild)
        print(head.val)

对中序遍历,费了我九牛二虎之力画了一个程序执行的图,红色箭头代表程序执行的过程,依然以a = [1,2,3,4,5,None,6,None,None,7,8]为例

所以程序打印出来的顺序为:4 2 7 5 8 1 3 6



最后,致敬大佬,祝各位学有所成。

【转载表明出处,谢谢】

时间: 2024-08-03 13:50:30

Python --- 二叉树的层序建立与三种遍历的相关文章

重温数据结构:二叉树的常见方法及三种遍历方式 Java 实现

读完本文你将了解到: 什么是二叉树 Binary Tree 两种特殊的二叉树 满二叉树 完全二叉树 满二叉树 和 完全二叉树 的对比图 二叉树的实现 用 递归节点实现法左右链表示法 表示一个二叉树节点 用 数组下标表示法 表示一个节点 二叉树的主要方法 二叉树的创建 二叉树的添加元素 二叉树的删除元素 二叉树的清空 获得二叉树的高度 获得二叉树的节点数 获得某个节点的父亲节点 二叉树的遍历 先序遍历 中序遍历 后序遍历 遍历小结 总结 树的分类有很多种,但基本都是 二叉树 的衍生,今天来学习下二

二叉树的建立和三种遍历

1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <assert.h> 4 #include <string.h> 5 typedef struct tree{ 6 int data; 7 struct tree *pLeft; 8 struct tree *pRight; 9 }*pT,T; 10 pT CreateTree(){ 11 int data=0; 12 pT p=NULL; 13 pu

数据结构 二叉树的建立及三种遍历方法

#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> using namespace std; typedef struct Binode{ char data; struct Binode *lchild,*rchild; }Binode,*Bitree; void CreatTREE(Bitree &T) { char ch; scanf("%c&

C++实现二叉树的建立和三种递归遍历

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二叉树是一种常见的数据结构,二叉树的遍历也是家常便饭的事了,这里仅仅写出一个完整的可以运行的C++代码来随便建立一个如下图所示的二叉树,建一棵二叉树是实现二叉树各种操作的基础,下面的程序也很简单,这只是二叉树练习的开始,以后的博文中,将会紧紧围绕这棵二叉树练习更多的操作:如求二叉树的大小,二叉树的深度,翻转二叉树...,这里只是基础中的基础,只是为以后的学习做铺垫. 下面给出C++代码,代码的功能包括: 1.建立如上图所示的简单的二叉树. 2.

二叉树三种遍历(递归以及非递归实现)

package com.shiyeqiang.tree; import java.util.Stack; public class BiTree { public static void main(String[] args) { // 首先构造叶子节点 BiTree leafA1 = new BiTree(4); BiTree leafA2 = new BiTree(5); BiTree leafB1 = new BiTree(6); BiTree leafB2 = new BiTree(7)

数据结构 《22》---- 二叉树三种遍历的迭代器算法

二叉树的三种遍历有递归版本,和迭代版本.本文介绍一种新的思路. 参考了 http://coolshell.cn/articles/9886.html 在许多应用中,我们还需要对遍历本身进行抽象.假如有一个求和的函数sum,我们希望它能应用于链表,数组,二叉树等等不同的数据结构.这时,我们可以抽象出迭代器(Iterator)的概念,通过迭代器把算法和数据结构解耦了,使得通用算法能应用于不同类型的数据结构. 以下给出了三种遍历的迭代器算法. class Iterator { public: virt

创建二叉树的两种方法以及三种遍历方法

二叉树的两种创建方法和三种遍历方法 这里的两种创建方法,一种值得是 数据结构上面的创建方法: 方法一 代码如下: 二叉树的结构定义如下: typedef struct BinaryTreeNode{ char value; struct BinaryTreeNode *left; struct BinaryTreeNode *right; }; - c语言版 void CreateBinaryTree(BinaryTreeNode **T) { char data; scanf("%d"

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

///////////////////头文件: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

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