Python实现二叉树的建立与遍历

  1. 创建(二叉)树节点类

    1. class Node:
    2. def __init__(self,data,l=None,r=None):
    3. self.val = data
    4. self.left = l
    5. self.right = r
  2. 创建(二叉)树

    1. class Tree:
    2. def __init__(self):
    3. self.root = None
    4. def add_node(self,item):
    5. node = Node(item)#实例化节点
    6. if self.root is None:
    7. self.root = node
    8. return
    9. queue = [self.root]#队列存放的是待操作节点一个个Node object
    10. while queue:
    11. cur_node = queue.pop(0)#取出队头作为当前操作节点
    12. if cur_node.left is None:
    13. cur_node.left = node
    14. return
    15. else:
    16. queue.append(cur_node.left)
    17. if cur_node.right is None:
    18. cur_node.right = node
    19. return
    20. else:
    21. queue.append(cur_node.right)
    22. #def 遍历函数...(如下)
  3. (二叉)树的遍历

    (1). 广度遍历(Breadth traversal)即层次遍历(Sequence traversal)

    1. def Breadth_travel(self):
    2. if self.root == None:
    3. return
    4. queue =[self.root]
    5. while queue:
    6. cur_node = queue.pop(0)
    7. print(cur_node.val,end=' ')
    8. if cur_node.left:
    9. queue.append(cur_node.left)
    10. if cur_node.right:
    11. queue.append(cur_node.right)

    (2). 深度遍历(Depth traversal)

    • 先序遍历(preorder traversal)

      1. def preorder(self,node):
      2. if node is None:
      3. return
      4. print(node.val,end=' ')
      5. self.preorder(node.left)
      6. self.preorder(node.right)
    • 中序遍历(inorder traversal)

      1. def inorder(self,node):
      2. if node is None:
      3. return
      4. self.inorder(node.left)
      5. print(node.val,end=' ')
      6. self.inorder(node.right)
    • 后序遍历(postorder traserval)

      1. def postorder(self,node):
      2. if node is None:
      3. return
      4. self.inorder(node.left)
      5. self.inorder(node.right)
      6. print(node.val,end=' ')
  4. 应用实例:[判断对称二叉树]

    说明:给定一个二叉树,检查他是否是镜像对称的。

    example

    源代码:(将下列源码加入到Tree类)

  1. def isSymmetric(self, node) -> bool:
  2. if node is None:
  3. return True
  4. def dfs(left,right):
  5. if left ==None and right ==None:#判空操作
  6. return 1
  7. if not (left and right):#如两边有一个为空(第一个if已经判断了同时为空)
  8. return 0
  9. if left.val!=right.val:#两边不为空,则判断两边的值
  10. return 0
  11. return dfs(left.left,right.right) and dfs(left.right,right.left)
  12. # 用递归函数,比较左节点,右节点
  13. return dfs(self.root.left,self.root.right)

主程序

  1. if __name__ == '__main__':
  2. tree = Tree()
  3. data = [1, 2, 2, 3, 4, 4, 3]
  4. for i in data:
  5. tree.add_node(i)
  6. #tree.preorder(tree.root)
  7. #tree.inorder(tree.root)
  8. #tree.postorder(tree.root)
  9. tree.Breadth_travel()
  10. print()
  11. print(tree.isSymmetric(tree.root))

bintree的更多相关文章

  1. 二叉树BinTree类定义

    #include<iostream> using namespace std; template<class T> struct BinTreeNode{//二叉树结点类 T ...

  2. 03-树1 树的同构 (C语言链表实现)

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h& ...

  3. 二叉树的层序遍历 BFS

    二叉树的层序遍历,或者说是宽度优先便利,是经常考察的内容. 问题一:层序遍历二叉树并输出,直接输出结果即可,输出格式为一行. #include <iostream> #include &l ...

  4. 【算法与数据结构】二叉搜索树的Java实现

    为了更加深入了解二叉搜索树,博主自己用Java写了个二叉搜索树,有兴趣的同学可以一起探讨探讨. 首先,二叉搜索树是啥?它有什么用呢? 二叉搜索树, 也称二叉排序树,它的每个节点的数据结构为1个父节点指 ...

  5. 【面经】用递归方法对二叉树进行层次遍历 && 二叉树深度

    void PrintNodeAtLevel(BiTree T,int level) { // 空树或层级不合理 ) return; == level) { cout << T->da ...

  6. python数据结构与算法——二叉树结构与遍历方法

    先序遍历,中序遍历,后序遍历 ,区别在于三条核心语句的位置 层序遍历  采用队列的遍历操作第一次访问根,在访问根的左孩子,接着访问根的有孩子,然后下一层 自左向右一一访问同层的结点 # 先序遍历 # ...

  7. c语言二叉树基本操作

    编译器为vs2013 #include "stdafx.h" #include<malloc.h> #include<stdlib.h> #define O ...

  8. UVa 二叉树重建(先序+中序求后序)

    题意是给出先序和中序,求出后序. 先序遍历先访问根结点,通过根结点可以在中序中把序列分为左子树部分和右子树部分,我建了一个栈,因为后序遍历最后访问根结点,所以把每次访问的根结点放入栈中.因为后序遍历先 ...

  9. java项目——数据结构实验报告

    java项目——数据结构总结报告 20135315  宋宸宁 实验要求 1.用java语言实现数据结构中的线性表.哈希表.树.图.队列.堆栈.排序查找算法的类. 2.设计集合框架,使用泛型实现各类. ...

随机推荐

  1. Hadoop真分布式实现SSH免密登录

    首先需要两台服务器(CentOS安装Linux见:https://www.cnblogs.com/syq816/p/12355115.html) 伪分布式的搭建见:https://www.cnblog ...

  2. python---复杂度、斐波那切数列、汉诺塔

    时间复杂度 ​ 用来估计算法运行时间的一个式子. ​ 一般来说, 时间复杂度高的算法比复杂度低的算法慢. 常见的时间复杂度: ​ O(1) < O(logn) < O(n) < O( ...

  3. docker下将容器按照端口号分配

    问题情境:现在有一个服务器主机,安装了docker,想给成员分配各自的容器,但不想成员通过宿主机进入容器.那么成员如何直接访问容器呢? 成员可以通过ip加端口号访问 因此,需要生成一个容器,将容器的2 ...

  4. 帝国CMS 给简介字段添加一键排版按钮

    帝国CMS后台->管理数据表->选择数据表>打开smalltext字段输入表单替换html代码 添加如下代码: <script> function format() { ...

  5. JetBrains Rider C# 学习①

    Rider 发现 Alt+F7 键无效: 把GeForce Experience里的游戏覆盖关闭 前言 C#从入门到精通 链接:https://pan.baidu.com/s/1UveJI_f-c5D ...

  6. [转载] Golang交叉编译(跨平台编译)简述

    一.何为交叉编译 简单地说,就是在一个平台上生成另一个平台上的可执行代码.同一个体系结构可以运行不同的操作系统:同样,同一个操作系统也可以在不同的体系结构上运行. 二.交叉编译前的准备 本文只介绍Wi ...

  7. Java语言学习day32--8月07日

    ###07正则表达式邮箱地址验证 * A: 正则表达式邮箱地址验证 * a: 案例代码 public class RegexDemo2 { public static void main(String ...

  8. 【深入理解TcaplusDB技术】扫描数据接口说明——[List表]

    摘要 实现扫描指定表格中的数据. 示例代码 同步调用参见章节:[List表]扫描数据示例代码. 异步调用参见章节:[List表]异步扫描数据示例代码. Client对象方法说明 注:如有未列出来的Cl ...

  9. Enum枚举类型实战总结,保证有用!

    一般在我们开发时如果能使用枚举罗列的,一般都会定义一个枚举类型.将枚举类型作为方法的参数,可以方便的进行调用,给我们带来不少的遍历,当然有时候它还不如直接用一个int类型带来,带来一定灵活性.但只要能 ...

  10. Arraylist面试三连问

    点赞在看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 本文在公众号文章已同步,还有各种一线大厂面试原题.我的学习系列笔记. Arraylist为什么要加transient? ArrayList源 ...