遍历二叉树   traversing binary tree 线索二叉树 threaded binary tree 线索链表 线索化

1、

二叉树3个基本单元组成:根节点、左子树、右子树

以L、D、R分别表示遍历左子树、访问根节点、遍历右子树

可能的情况6种

排列A3 2

LDR LRD

DLR DRL

RLD RDL

若限定先左后右

LDR LRD  中根序遍历  后根序遍历

DLR  先根序遍历

先/中/后 序遍历

class Node:
def __init__(self, data):
self.left = None
self.right = None
self.data = data

def insert(self, data):
if self.data is None:
self.data = data
else:
if data < self.data:
if self.left is None:
self.left = Node(data)
else:
self.left.insert(data)
elif data == self.data:
pass
else:
if self.right is None:
self.right = Node(data)
else:
self.right.insert(data)

def find(self, data):
'''
???
:param data:
:return:
'''
cmp_data = self.data
if data < cmp_data:
if self.left:
return self.left.find(data)
elif data == cmp_data:
return True
else:
if self.right:
return self.right.find(data)
return False

def preorder_traversal(self):
'''
前序遍历
:return:
'''
if self.left:
self.left.preorder_traversal()
print(self.data, end=',')
if self.right:
self.right.preorder_traversal()

def inorder_traversal(self):
'''
中序遍历
:return:
'''

print(self.data, end=',')
if self.left:
self.left.inorder_traversal()
if self.right:
self.right.inorder_traversal()

def postorder_traversal(self):
'''
后序遍历
:return:
'''
if self.left:
self.left.postorder_traversal()
if self.right:
self.right.postorder_traversal()
print(self.data, end=',')

root = Node(12)
root.insert(6)
root.insert(14)
root.insert(3)
root.insert(1)
root.insert(11)
root.insert(15)
root.insert(13)
root.insert(2)
root.insert(0)
root.insert(16)
print('\n前序遍历0,1,2,3,6,11,12,14,13,15,16')
root.preorder_traversal()
print('\n中序遍历12,6,3,1,0,2,11,14,13,15,16')
root.inorder_traversal()
print('\n后序遍历0,2,1,3,11,6,13,16,15,14,12')
root.postorder_traversal()
'''
12
6 14
3 11 13 15
1 16
0 2

'''
print('\n')
for i in [3, 5, 15, 7, 0, -1]:
print('i', i)
r = root.find(i)

前序遍历0,1,2,3,6,11,12,14,13,15,16
0,1,2,3,6,11,12,13,14,15,16,
中序遍历12,6,3,1,0,2,11,14,13,15,16
12,6,3,1,0,2,11,14,13,15,16,
后序遍历0,2,1,3,11,6,13,16,15,14,12
0,2,1,3,11,6,13,16,15,14,12,

中序遍历的结果是升序排列

递归中的return

https://baike.baidu.com/item/递归函数/5634537?fr=aladdin

编程语言中,函数Func(Type a,……)直接或间接调用函数本身,则该函数称为递归函数。递归函数不能定义为内联函数。
在数学上,关于递归函数的定义如下:对于某一函数f(x),其定义域是集合A,那么若对于A集合中的某一个值X0,其函数值f(x0)由f(f(x0))决定,那么就称f(x)为递归函数。
 
 
 

https://baike.baidu.com/item/二叉搜索树

二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。二叉搜索树作为一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势;所以应用十分广泛,例如在文件系统和数据库系统一般会采用这种数据结构进行高效率的排序与检索操作。 [1] 

前序遍历 排序 二叉搜索树 递归函数的数学定义 return 递归函数不能定义为内联函数 f(x0)由f(f(x0))决定的更多相关文章

  1. PAT 1043 Is It a Binary Search Tree (25分) 由前序遍历得到二叉搜索树的后序遍历

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...

  2. L2-004 这是二叉搜索树吗? (25 分) (树)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 题目: 一棵二叉搜索树可被递归地定义为 ...

  3. pta l2-4(这是二叉搜索树吗?)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070971912192 题意:给定n以及n个整数,问该序列 ...

  4. 【遍历二叉树】07恢复二叉搜索树【Recover Binary Search Tree】

    开一个指针数组,中序遍历这个二叉搜索树,将节点的指针依次保存在数组里, 然后寻找两处逆序的位置, 中序便利里BST得到的是升序序列 ++++++++++++++++++++++++++++++++++ ...

  5. 二叉树系列 - 二叉搜索树 - [LeetCode] 中序遍历中利用 pre节点避免额外空间。题:Recover Binary Search Tree,Validate Binary Search Tree

    二叉搜索树是常用的概念,它的定义如下: The left subtree of a node contains only nodes with keys less than the node's ke ...

  6. 每日一题 - 剑指 Offer 33. 二叉搜索树的后序遍历序列

    题目信息 时间: 2019-06-26 题目链接:Leetcode tag:分治算法 递归 难易程度:中等 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回 tr ...

  7. 二叉搜索树 & 二叉树 & 遍历方法

    二叉搜索树 & 二叉树 & 遍历方法 二叉搜索树 BST / binary search tree https://en.wikipedia.org/wiki/Binary_searc ...

  8. 二叉搜索树的第k大的节点

    题目 给定一颗二叉搜索树,请找出其中的第k大的结点. 思路 如果中序遍历一棵二叉搜索树,遍历序列的数值则是递增排序,因此只需中序遍历一个二叉搜索树即可. #include <iostream&g ...

  9. 【二叉搜索树】PAT-天梯赛- L2-004. 这是二叉搜索树吗?

    大致题意: 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点,    其左子树中所有结点的键值小于该结点的键值:    其右子树中所有结点的键值大于等于该结点的键值:    其左右子树 ...

随机推荐

  1. 跳表(SkipList)设计与实现(Java)

    微信搜一搜「bigsai」关注这个有趣的程序员 文章已收录在 我的Github bigsai-algorithm 欢迎star 前言 跳表是面试常问的一种数据结构,它在很多中间件和语言中得到应用,我们 ...

  2. phaser3入门教程-从零开始开发一个打砖块游戏

    项目代码 项目代码 体验一下 空格开始,左右箭头控制移动 体验一下 Phaser简介 Phaser是一个HTML5游戏框架.它使用了许多HTML5 API,例如Canvas,WebGL,Audio,G ...

  3. JPA 复杂查询 - Querydsl

     添加依赖 <!--query dsl --> <dependency> <groupId>com.querydsl</groupId> <art ...

  4. eclips快捷键

    所谓"工欲善其事必先利其器",程序写多了,对于快捷键总有些特别的偏爱.在众多编辑器中,Eclipse算是用的比较多,也是最熟的. 最常用(也是最爱的:)) Ctrl+' :  自动 ...

  5. Linux top命令在生产环境的妙用

    top linux下的任务管理器 top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器.top是一个动态显示过程,即可以通过用户按键来 ...

  6. js--数组的every()和some()方法检测数组是否满足条件的使用介绍

    前言 阅读本文之前先来思考一个问题,如何如实现判断一个数组中是否存在满足条件的元素,如何去判断数组中是否全部元素都满足判断条件,这里可能能想到使用for循环遍历数组,if()判断每一项是否符合条件,同 ...

  7. hive之Json解析(普通Json和Json数组)

    一.数据准备 现准备原始json数据(test.json)如下: {"movie":"1193","rate":"5", ...

  8. 【python接口自动化】- DDT数据驱动测试

    简单介绍 ​ DDT(Date Driver Test),所谓数据驱动测试,简单来说就是由数据的改变从而驱动自动化测试的执行,最终引起测试结果的改变.通过使用数据驱动测试的方法,可以在需要验证多组数据 ...

  9. Syn_Flood攻击&防御手段

    Syn_Flood攻击原理 攻击者首先伪造地址对服务器发起SYN请求(我可以建立连接吗?),服务器就会回应一个ACK+SYN(可以+请确认).而真实的IP会认为,我没有发送请求,不作回应.服务器没有收 ...

  10. js如何替换字符串中匹配到多处中某一指定节点?

    抛出一个问题,如图,搜索关键字,匹配到四处,那我鼠标放在第二处,我想把它变个颜色,该怎么实现呢?回到文章的标题,js如何替换字符串中匹配到多处中某一指定节点? 字符串的替换,我们首先想到的一个属性是r ...