二叉树与排序二叉树

二叉树

  • python实现二叉树的结构:

    • 根节点
    • 左叶子节点
    • 右叶子节点
    • 子树
    • 高度
  • 二叉树的遍历:

    • 广度优先(层次遍历)
    • 深度优先:
      • 前序(根左右):把根放到最前面      
      • 中序(左根右):把根放到中间      
      • 后序(左右根):把根放到最后
    #封装一个节点对象
    class Node(object):
        def __init__(self,item):
            self.item = item
            self.left = None
            self.right = None
    class Tree(object):
        def __init__(self):#构造出一颗空的二叉树
            self.root = None #root指向第一个节点的地址,如果root指向了None,则该二叉树为空
        #向二叉树中插入节点
        def addNode(self,item):
            node = Node(item)
            if self.root == None:
                #addNode如果第一次被调用则意味着:向空树中插入第一个节点,该节点一定是该树的根节点
                self.root = node
                return
            cur = self.root
            queue = [cur]
            while queue:
                n = queue.pop(0)
                if n.left != None:
                    queue.append(n.left)
                else:
                    n.left = node
                    break
                if n.right != None:
                    queue.append(n.right)
                else:
                    n.right = node
                    break
        def travel(self):
            """广度遍历"""
            #如果是为空则
            if self.root == None:
                print('空!')
                return
            #树为非空
            cur = self.root
            queue = [cur]
            while queue:
                n = queue.pop(0)
                print(n.item)
                if n.left != None:
                    queue.append(n.left)
                if n.right != None:
                    queue.append(n.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 not root:
                return
            self.middle(root.left) # 递归,将root变为左叶子节点的根
            print(root.item, end='')
            self.middle(root.right)
            
        def back(self, root):
            """后序(左右后)"""
            if not root:
                return
            self.back(root.left)
            self.back(root.right)
            print(root.item)
    

排序二叉树

  • 插入节点的时候一定要遵从的原则:比根节点小的节点同一插入在树的左侧,比根节点大的节点同一插在数据的右侧

  • 构建排序二叉树

    class Node(object):
        def __init__(self,item):
            self.item = item
            self.left = None
            self.right = None
    class sort(object):
        class SortTree():
        def __init__(self):
            self.root = None
            
        def insertNode(self,item):
            node = Node(item)
            #向空树中插入第一个节点的情况
            if self.root == None:
                self.root = node
                return
            #树为非空的情况
            cur = self.root
            while True:
                if node.item > cur.item:#往右插
                    if cur.right == None:
                        cur.right = node
                        break
    
                    else:
                        cur = cur.right
                else:#往左插
                    if cur.left == None:
                        cur.left = node
                        break
                    else:
                        cur = cur.left
            
        def middleTravel(self,root): # 只有中序才能将排序二叉树中的节点数据按顺序读出
            if root == None:
                return
            self.middle(root.left)
            print(root.item)
            self.middle(root.right)