首页 > 其他分享 >二叉树||二叉树的遍历||排序二叉树||二分查找

二叉树||二叉树的遍历||排序二叉树||二分查找

时间:2023-02-18 19:33:39浏览次数:40  
标签:二分 None 遍历 self tree item right 二叉树 root

二叉树

  • 根节点

  • 叶子节点:

    • 左叶子节点

    • 右叶子节点

  • 树的层级

  • 树的高度

二叉树的遍历

  • 广度优先遍历

    • 一层一层对节点进行遍历

  • 深度优先遍历

    • 前序:根左右

    • 中序:左根右

    • 后序:左右根

class Node():
    def __init__(self,item):
        self.item=item
        self.left=None
        self.right=None
class Tree():
    def __init__(self):
        self.root=None
    def addNode(self,item):
        node=Node(item)
        #如果插入第一个节点的情况
        if self.root==None:
            self.root=node
            return
        cur=self.root
        q=[cur]
        while q:
            nd=q.pop(0)

            if nd.left==None:
                nd.left=node
                return
            else:
                q.append(nd.left)
            if nd.right==None:
                nd.right=node
                return
            else:
                q.append(nd.right)
    def travel(self):
        cur=self.root
        q=[cur]
        while q:
            nd=q.pop(0)
            print(nd.item)
            if nd.left:
                q.append(nd.left)
            if nd.right:
                q.append(nd.right)

    def forward(self,root): #排序:根左右
        if root==None:
            return
        print(root.item)
        self.forward(root.left)
        self.forward(root.right)

    def middle(self,root): #排序:左根右
        if root==None:
            return
        self.middle(root.left)
        print(root.item)
        self.middle(root.right)

    def back(self,root): #排序:左右根
        if root==None:
            return
        self.back(root.left)
        self.back(root.right)
        print(root.item)


tree=Tree()
tree.addNode(1)
tree.addNode(2)
tree.addNode(3)
tree.addNode(4)
tree.addNode(5)
tree.addNode(6)
tree.addNode(7)
# tree.addNode(8)
# print(tree.travel())

# print(tree.forward(tree.root))
# 1 2 4 5 3 6 7

# print('>>>2',tree.middle(tree.root))

# 4 2 5 1 6 3 7

# print('>>>3',tree.back(tree.root))
# 4 5 2 6 7 3 1

 

排序二叉树

  • 乱序数据的插入的时候,需要遵从一个准则:

    • 插入的第一个数值作为树的根节点

    • 后序插入的数值,如果比根节点小,插入根节点的左侧,否则插入到根节点的右侧。

class Node():
    def __init__(self,item):
        self.item=item
        self.left=None
        self.right=None
class sortTree():
    def __init__(self):
        self.root=None
    def add(self,item):
        node=Node(item)
        cur=self.root
        if self.root==None:
            self.root=node
            return
        while True:
            #向右侧插入
            if item>cur.item:
                if cur.right==None:
                    cur.right=node
                    return
                else:
                    cur=cur.right
            else: #向左插入
                if cur.left==None:
                    cur.left=node
                    return
                else:
                    cur=cur.left
    def forward(self,root): #排序:根左右
        if root==None:
            return
        print(root.item)
        self.forward(root.left)
        self.forward(root.right)

    def middle(self,root): #排序:左根右
        if root==None:
            return
        self.middle(root.left)
        print(root.item)
        self.middle(root.right)

    def back(self,root): #排序:左右根
        if root==None:
            return
        self.back(root.left)
        self.back(root.right)
        print(root.item)

tree=sortTree()
alist=[3,8,5,7,6,2,9,4,1]
for i in alist:
    tree.add(i)
print('>>>1',tree.forward(tree.root))
print('>>>2',tree.back(tree.root))
print('>>>3',tree.middle(tree.root))

 

二分查找

 

alist=[1,2,3,4,5,6,7,8,9]
def find(alist,item):
    find=False
    mid_index=len(alist)//2
    first=0
    last =len(alist)-1

    while first<last:
        mid_index=(first+last)//2
        if alist[mid_index]<item: #去中间元素的右侧继续去寻找
            first=mid_index+1
        elif alist[mid_index]>item:
            last=mid_index-1
        else:
            find=True
            break
    return find
print(find(alist,5))

 

标签:二分,None,遍历,self,tree,item,right,二叉树,root
From: https://www.cnblogs.com/mengdie1978/p/17133362.html

相关文章

  • 【LeetCode二叉树#01】二叉树的遍历(递归/迭代)
    二叉树递归遍历写递归算法时候需要遵循的三个点:确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递......
  • 【LeeCode】二叉树理论
    二叉树分类没有数值满⼆叉树如果⼀棵⼆叉树只有度为0的结点和度为2的结点,并且度为0的结点在同⼀层上,则这棵⼆叉树为满⼆叉树​满⼆叉树,也可以说深度为k,有2^k-1个节点的⼆叉......
  • 代码随想录算法训练营Day18 二叉树
    代码随想录算法训练营代码随想录算法训练营Day18二叉树|513.找树左下角的值112.路径总和113.路径总和ii106.从中序与后序遍历序列构造二叉树105.从前序与中序遍历......
  • lc二叉树中序遍历
    94.二叉树的中序遍历给定一个二叉树的根节点root,返回它的中序遍历。示例1:输入:root=[1,null,2,3]输出:[1,3,2]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出......
  • PHP超低内存遍历目录文件和读取超大文件
    前言这篇笔记主要解决这么几个问题:PHP如何使用超低内存快速遍历数以万计的目录文件?PHP如何使用超低内存快速读取几百MB甚至是GB级文件?顺便解决哪天我忘了可以通过搜索引擎......
  • ybtoj 第三章 二分
    T1:二分和的最大值从max~sum每次check最小可以分成的份数若<=m则合法r=mid否则不合法l=mid+1intnow=0;intcnt=1;now=a[1];这样就ojbk了T2:直接二分从1......
  • 算法随想Day15【二叉树】| LC110-平衡二叉树、LC257-二叉树的所有路径、LC404-左叶子
    LC110.平衡二叉树递归做法一次通过,其实也就是对比:某个节点的左子树和右子树的最大深度的绝对值不大于1,即可认为是平衡二叉树classSolution{public:boolflag;......
  • Java基础知识点(数组遍历以及常见问题)
    一:数组遍历:将数组中的所有内容取出来,取出来之后可以对它进行一系列的操作。注意:遍历指的是取出数据的过程,不要局限的理解为遍历就是打印。在Java中,关于数组的一个长度属性.l......
  • 【LeetCode二叉树#00】二叉树的基础知识
    基础知识分类满二叉树如果二叉树中除了叶子结点,每个结点的度都为2,则此二叉树称为满二叉树。完全二叉树除了底层外,其他部分是满的,且底层从左到右是连续的,称为完全二......
  • BeautifulSoup文档3-详细方法 | 如何对文档树进行遍历?
    (3-详细方法|如何对文档树进行遍历?)以下实例还是官网的例子:html_doc="""<html><head><title>TheDormouse'sstory</title></head><body><pclass="title"><......