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

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

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

    class Tree:
    def __init__(self):
    self.root = None
    def add_node(self,item):
    node = Node(item)#实例化节点
    if self.root is None:
    self.root = node
    return
    queue = [self.root]#队列存放的是待操作节点一个个Node object
    while queue:
    cur_node = queue.pop(0)#取出队头作为当前操作节点
    if cur_node.left is None:
    cur_node.left = node
    return
    else:
    queue.append(cur_node.left)
    if cur_node.right is None:
    cur_node.right = node
    return
    else:
    queue.append(cur_node.right)
    #def 遍历函数...(如下)
  3. (二叉)树的遍历

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

        def Breadth_travel(self):
    if self.root == None:
    return
    queue =[self.root]
    while queue:
    cur_node = queue.pop(0)
    print(cur_node.val,end=' ')
    if cur_node.left:
    queue.append(cur_node.left)
    if cur_node.right:
    queue.append(cur_node.right)

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

    • 先序遍历(preorder traversal)

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

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

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

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

    example

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

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

主程序

if __name__ == '__main__':
tree = Tree()
data = [1, 2, 2, 3, 4, 4, 3]
for i in data:
tree.add_node(i)
#tree.preorder(tree.root)
#tree.inorder(tree.root)
#tree.postorder(tree.root)
tree.Breadth_travel()
print()
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. 循序渐进搞懂 TCP 三次握手核心

    前言 本文旨在通过形象的例子和实操,把无形的.虚拟的网络转为具体的.可视化的.带领网络小白一步步的掌握 TCP 三次握手核心知识点,为后续深入学习 TCP 协议打基础. 通俗版 如下图所示,小明(客户 ...

  2. 如何查看k8s相关日志

    一.看系统日志cat /var/log/messages 二.用 kubectl 查看日志 # 注意:使用Kubelet describe 查看日志,一定要带上 命名空间,否则会报如下错误[root@ ...

  3. String类 的基本用法

    1.String 对象的创建 String对象的创建有两种方式. 第1 种方式就是我们最常见的创建字符串的方式: String str1 = "Hello, 慕课网"; 第 2 种 ...

  4. [翻译] Cassandra 分布式结构化存储系统

    Cassandra 分布式结构化存储系统 摘要 Cassandra 是一个分布式存储系统,用于管理分布在许多商品服务器上的大量结构化数据,同时提供无单点故障(no single point of fa ...

  5. JS/JQ动态创建(添加)optgroup和option属性

    JavaScript和Jquery动态操作select下拉框 相信在前端设计中必然不会少的了表单,因为经常会使用到下拉框选项,又或是把数据动态回显到下拉框中.因为之前牵扯到optgroup标签时遇到了 ...

  6. Go xmas2020 学习笔记 06、Control Statements、Declarations & Types

    06-Control Statements. If-then-else. Loop. for. range array. range map. infinite loop. common mistak ...

  7. vue动态绑定属性--基本用法及动态绑定class

    动态绑定属性v-bind:,语法糖形式:省略v-bind,仅写一个冒号. 一.动态绑定基本属性 1 <body> 2 <!-- v-bind 动态绑定属性-基本用法 --> 3 ...

  8. TexFormula2Word: 将Latex公式转换为MathML的Chrome扩展

    前言 因为学校要求对毕业论文进行格式检查,而格式检查又必须上传Word文件,这就导致只能使用Word写毕业论文.但Word公式输入实在是太难用,加之我在小论文中已经用Latex写过大部分公式,所以就希 ...

  9. python基础练习题(题目 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身)

    day8 --------------------------------------------------------------- 实例013:所有水仙花数 题目 打印出所有的"水仙花 ...

  10. kali2021.4a搭建pwn环境

    最近电脑重装系统(吐槽一下,win11真的一言难尽),顺便在虚拟机装了最新版本的KaliLinux,顺带着搭建一下PWN环境.总的来说这次搭建PWN环境问题不大,按照之前安装的步骤,整个过程还算是比较 ...