二叉树的基础知识

一,树

E为根节点,BCD互称为兄弟节点,G、H、I、J、K、L互称为叶子节点(没有子节点)

树的高度,深度,层数.

高度从下往上数(0开始),深度从上往下数(0开始).

二,二叉树

2为满二叉树,二叉树中除了叶子结点,每个结点的度都为 2.

3为完全二叉树,如果二叉树中除去最后一层节点为满二叉树,且最后一层的结点依次从左到右分布

# 实现一个二叉树
class TreeNode:def __init__(self, x):self.val = xself.left = Noneself.right = Noneself.nexts = []root_node = TreeNode(1)
node_2 = TreeNode(2)
node_3 = TreeNode(3)
node_4 = TreeNode(4)
node_5 = TreeNode(5)
node_6 = TreeNode(6)
node_7 = TreeNode(7)
node_8 = TreeNode(8)
node_9 = TreeNode(9)
node_10 = TreeNode(10)def littleTree(root, left, right):root.left = leftroot.right = rightif root.left:root.nexts.append(root.left)if root.right:root.nexts.append(root.right)# print(root.left)# print(root.right)# print(root.nexts)littleTree(root_node, node_2, node_3)
littleTree(node_2, node_4, node_5)
littleTree(node_5, node_10, None)
print('===root_node:', root_node.left)
print('===root_node:', root_node.right)
print('===root_node:', root_node.nexts)
print('===root_node.left.left:', root_node.left.left)
print('===root_node.left.right:', root_node.left.right)
print('===root_node.left.nexts:', root_node.left.nexts)

 

三,存储二叉树

3.1链式存储

大部分二叉树采用这种结果存储.

每个节点有三个字段,其中一个存储数据,另外两个是指向左右子节的指针.

3.2顺序存储

根节点存储在i=1,左子节点存储在2*i,右子节点存储在2*i+1

由上可看出,对于完全二叉树,顺序存储相比链式存储节约空间,其他的话就浪费空间了.

四,二叉树遍历

4.1前序遍历

对树中的任意节点,先打印节点,在打印左子树,最后打印右子树.

对于根节点开始:

先遍历根节点;

随后递归地遍历左子树;

最后递归地遍历右子树。

4.2中序遍历

对树中的任意节点,先打印左子树,在打印节点,最后打印右子树.

先递归地遍历左子树;

随后遍历根节点;

最后递归地遍历右子树。

4.3后序遍历

对树中的任意节点,先打印左子树,在打印右子树,最后打印节点.

先递归地遍历左子树;

最后递归地遍历右子树。

随后遍历根节点;

二叉树前序遍历的顺序为:

二叉树中序遍历的顺序为:

前序遍历的递推公式:
preOrder(r) = print r->preOrder(r->left)->preOrder(r->right)

中序遍历的递推公式:
inOrder(r) = inOrder(r->left)->print r->inOrder(r->right)

后序遍历的递推公式:
postOrder(r) = postOrder(r->left)->postOrder(r->right)->print r

可看出每个节点最多会被访问两次,所以遍历操作的时间复杂度,跟节点的个数n成正比,时间复杂度是O(n).

例1:二叉树的创建和遍历

class BTNode(object):def __init__(self, key=None, lchild=None, rchild=None):self.key = keyprint('self.key',self.key)self.lchild = lchildprint('self.lchild',self.lchild)self.rchild = rchildprint('self.rchild',self.rchild)class BiTree(object):def __init__(self, data_list):#初始化即将传入的列表的迭代器self.it = iter(data_list)print('self.it',self.it)def createBiTree(self, bt=None):try:#步进获取下一个元素next_data = next(self.it)print('next_data=',next_data)#如果当前列表元素为'#', 则认为其为 Noneif next_data is "#":bt = Noneelse:bt = BTNode(next_data)bt.lchild = self.createBiTree(bt.lchild)bt.rchild = self.createBiTree(bt.rchild)except Exception as e:print(e)return bt#先序遍历函数def preOrderTrave(self, bt):if bt is not None:print(bt.key, end=" ")self.preOrderTrave(bt.lchild)self.preOrderTrave(bt.rchild)#中序遍历函数def inOrderTrave(self, bt):if bt is not None:self.inOrderTrave(bt.lchild)print(bt.key, end=" ")self.inOrderTrave(bt.rchild)#后序遍历函数def postOrderTrave(self, bt):if bt is not None:self.postOrderTrave(bt.lchild)self.postOrderTrave(bt.rchild)print(bt.key, end=" ")#综合打印def printTrave(self, bt):print("先序遍历: ", end="")self.preOrderTrave(bt)print('\n')print("中序遍历: ", end="")self.inOrderTrave(bt)print('\n')print("后序遍历: ", end="")self.postOrderTrave(bt)print('\n')# data = input("Please input the node value: ")
# data_list = list(data)
data_list=['a', 'b', 'd', '#', 'g', '#', '#', 'c', 'e', '#', '#', 'f', 'h', '#', '#', '#']
print(data_list)
#构建二叉树
btree = BiTree(data_list)
root = btree.createBiTree()btree.printTrave(root)

例2:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/

class BTNode(object):def __init__(self, key=None, lchild=None, rchild=None):self.key = keyprint('self.key',self.key)self.lchild = lchildprint('self.lchild',self.lchild)self.rchild = rchildprint('self.rchild',self.rchild)class BiTree(object):def __init__(self, data_list):#初始化即将传入的列表的迭代器self.it = iter(data_list)print('self.it',self.it)def createBiTree(self, bt=None):try:#步进获取下一个元素next_data = next(self.it)print('next_data=',next_data)#如果当前列表元素为'#', 则认为其为 Noneif next_data is "#":bt = Noneelse:bt = BTNode(next_data)bt.lchild = self.createBiTree(bt.lchild)bt.rchild = self.createBiTree(bt.rchild)except Exception as e:print(e)return bt#先序遍历函数def preOrderTrave(self, bt):if bt is not None:print(bt.key, end=" ")self.preOrderTrave(bt.lchild)self.preOrderTrave(bt.rchild)#中序遍历函数def inOrderTrave(self, bt):if bt is not None:self.inOrderTrave(bt.lchild)print(bt.key, end=" ")self.inOrderTrave(bt.rchild)#后序遍历函数def postOrderTrave(self, bt):if bt is not None:self.postOrderTrave(bt.lchild)self.postOrderTrave(bt.rchild)print(bt.key, end=" ")#综合打印def printTrave(self, bt):print("先序遍历: ", end="")self.preOrderTrave(bt)print('\n')print("中序遍历: ", end="")self.inOrderTrave(bt)print('\n')print("后序遍历: ", end="")self.postOrderTrave(bt)print('\n')def TreeDepth(self, pRoot):# write code hereif pRoot == None:return 0return max(self.TreeDepth(pRoot.lchild), self.TreeDepth(pRoot.rchild)) + 1# data = input("Please input the node value: ")
# data_list = list(data)
# data_list=['a', 'b', 'd', '#', 'g', '#', '#', 'c', 'e', '#', '#', 'f', 'h', '#', '#', '#']
data_list=[3,9,'#','#',20,15,'#','#',7,'#','#']
print(data_list)
#构建二叉树
btree = BiTree(data_list)
root = btree.createBiTree()btree.printTrave(root)res=btree.TreeDepth(root)
print('res',res)

五,二叉查找树

其支持动态数据集合的快速插入、删除、查找操作.

插入、删除、查找操作的时间复杂度也比较稳定,是 O(logn).

二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值.

示例如下:

5.1 二叉查找树的查找操作

首先,我们看如何在二叉查找树中查找一个节点。我们先取根节点,如果等于就返回,根节点大的话就往左子树查找,否则往右子树查找.

5.2 二叉查找树的插入操作

新插入的数据一般在叶子节点,从根节点开始,比较插入数据和节点的大小关系.

如果插入的数据比节点数据大,并且节点的右子树为空,就将新数据插入到右子树空的位置,如果不为空就继续递归遍历右子树,查找插入位置.插入数据比节点数据小也是同理.

5.3 二叉查找树的删除操作

分三种情况:

1.例如55,没有子节点,只需要将父节点中,指向要删除子节点的指针置为null.

2.例如13,只有左子节点或者右子节点,我们只需要更新父节点中指针的指向,16的指针指向15.

3,例如18,有两个节点,需要找到这个节点的右子树最小节点19,把它替换到要删除的节点上,然后再删除这个最小节点19.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# GDI+绘图介绍

最近查阅网上资料,将GDI的基本知识汇总如下: 一、基本的知识 GDI:Graphics Device Interface Plus也就是图形设备接口,提供了各种丰富的图形图像处理功能; 在C#.NET中,使用GDI处理二维(2D)的图形和图像&…

统计学第二章--感知机

感知机是一种较为简单的二分类模型,感知机旨在学习能够将输入数据划分为1/-1的线性分离超平面,所以说整体而言感知机是一种线性模型。 查看数据集 import pandas as pd import numpy as np from sklearn.datasets import load_iris import matplotlib.…

你坐飞机时可能意识不到,AI已经全流程为你保驾护航

作者 :Alyson Behr编译:机器之能 高璇、微胖摘要:AI在航空领域的应用比你目前所知的还要丰富。除了自动驾驶,从驾驶舱到后勤部门乃至客户体验,对于AI应用的探索几乎遍及整个行业。当「人工智能」和航空业结合在一起时…

pytorch基础知识+构建LeNet对Cifar10进行训练+PyTorch-OpCounter统计模型大小和参数量+模型存储与调用

整个环境的配置请参考我另一篇博客。ubuntu安装python3.5pycharmanacondaopencvdockernvidia-dockertensorflowpytorchCmake3.8_智障变智能-CSDN博客 中文文档:torch - PyTorch中文文档 github简单示例:多卡分布式教程,带有多卡mnist分布式训练和单卡训…

量子计算

来源:博客丨政策管理作者:贺飞(北京大学)摘要:量子计算:前途光明 道路曲折量子计算:前途光明 道路曲折(一)本周,美国国家科学院、工程院和医学院的一个由13…

深度学习可视化的一些工具+pytorch实现回归与卷积可视化

一.深度学习可视化的一些工具 1.深度学习网络结构画图工具:https://cbovar.github.io/ConvNetDraw/ 2.将.onnx放入即可,可视化网络结构:https://lutzroeder.github.io/netron/ 3.结构可视化工具:https://github.com/HarisIqbal88/PlotNeuralNet 二.回归 线性回归的损失函数…

《人工智能转型手册》,吴恩达 著

来源:量子位AI大者,为国为民。从今往后,市值5亿美元至5000亿美元的企业,都能用得上、用得会、用得好吴恩达的AI转型经验了。这是他在谷歌和百度带队AI的核心总结,也是他见得广、听得多、被咨询无数后的精华提炼。一册《…

Android Studio开发入门-引用jar及so文件

作者:王先荣 最近初学安卓开发,因为以前从未用过JAVA,连基本的语法都要从头开始,所以不太顺利。在尝试使用百度语音识别引擎时遇到了如何引用jar及so文件的问题。在GOOGLE加多次尝试之后,找到了一个比较简单的方法&…

腾讯杰出科学家写给2029的信:计算机视觉AI技术的爆点在哪里?

文 |腾讯杰出科学家、腾讯优图实验室负责人 贾佳亚 腾讯优图实验室总监 戴宇荣博士 郑冶枫博士近年来,计算机视觉AI技术发展迅速,尤其是人工智能的引入大大提升了算法的能力和实用性。在数不清的视觉AI应用中,我们认为未来技术的爆发点可能来…

pytorch实现Dropout与正则化防止过拟合

numpy实现dropout与L1,L2正则化请参考我另一篇博客 https://blog.csdn.net/fanzonghao/article/details/81079757 pytorch使用dropout与L2 import torch import matplotlib.pyplot as plt torch.manual_seed(1) # Sets the seed for generating random numbers.reproduc…

“蚁人”不再是科幻!MIT最新研究,能把任何材料物体缩小1000倍 | Science

来源:量子位科学加速,科幻成真也在加速。漫威世界中,蚁人是蚂蚁大小的超级英雄,靠一件“变身服”,人类就能在更微观的世界里大干一场。现在,类似的科幻想象,被MIT变成现实。丨小小小&#xff0c…

Android ARM指令学习

在逆向分析Android APK的时候,往往需要分析它的.so文件。这个.so文件就是Linux的动态链接库,只不过是在ARM-cpu下编译的。所以学习Android下的ARM指令很重要。目前,市面上的ARM-cpu基本都支持一种叫做THUMB的指令集模式。这个THUMB指令集可以…

cuda基础知识

nvidia-cuda 手册:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#kernels nvidia cuda 教学视频 https://www.nvidia.cn/object/cuda_education_cn_old.html 介绍: CUDA编程模型是一个异构模型,需要CPU和GPU协同工作。在CUDA中,…

苹果着手自研调制解调器,以应对高通天价专利费

来源:DeepTech深科技近日,苹果官方发布一份招聘信息,其中有一个职位就非常惹人注意,根据信息,苹果准备招募两名蜂窝调制解调器系统架构师,一名构架师的工作地点在圣克拉拉,另一名构架师的工作地…

labelme标注文件转coco json,coco json转yolo txt格式,coco json转xml, labelme标注文件转分割,boxes转labelme json

参考:https://github.com/wkentaro/labelme 一.labelme标注文件转coco json 1.标注时带图片ImageData信息,将一个文件夹下的照片和labelme的标注文件,分成了train和val的coco json文件和照片, (COCO的格式: [x1,y1,…

“深度学习之父”大谈AI:寒冬不会出现,论文评审机制有损创新

来源: AI科技大本营整理:琥珀近日《连线》杂志发表了一篇文章,记录了与“深度学习之父” Geoffrey Hinton 围绕人工智能伦理、技术、学术等领域的采访实录。当被问到如今人工智能是否将走进寒冬时,Hinton 的回答非常坚决&#xff…

GDataXML解析XML文档

一、GDataXMLNode说明GDataXMLNode是Google提供的用于XML数据处理的类集。该类集对libxml2--DOM处理方式进行了封装,能对较小或中等的xml文档进行读写操作且支持XPath语法。 使用方法:1、获取GDataXMLNode.h/m文件,将GDataXMLNode.h/m文件添加…

RetinaNet+focal loss

one stage 精度不高,一个主要原因是正负样本的不平衡,以YOLO为例,每个grid cell有5个预测,本来正负样本的数量就有差距,再相当于进行5倍放大后,这种数量上的差异更会被放大。 文中提出新的分类损失函数Foca…

真实用户首次披露Waymo无人车服务体验: 为避开左转, 故意绕路

来源 :Ars Technica编译 :机器之能 高璇外国网友炸了:「就像看了一部大导演导的烂片一样。」在过去的 18 个月里,Waymo 的汽车一直在凤凰城的东南角运送乘客。该公司在合同中明确规定禁止乘客讨论用户体验,对项目信息进…

“横平竖直”进行连线+将相邻框进行合并

一.横平竖直”进行连线 解法1.将一些坐标点按照x相等,y相等连起来 解法1.根据 x或y总有一个相等的,用np.sum来找出和为1的点,然后在连起来,存在重复连线的问题. import numpy as npcoord np.array([[10, 60],[10, 20],[20, 20],[40, 40],[40, 60],[20, 40]])img np.zeros(…