zoukankan      html  css  js  c++  java
  • 二叉树

    平衡二叉树

      它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

    完全二叉树

      对一颗具有n个结点的二叉树按层进行编号,如果编号为i (1 <= i <= n)的结点与同样深度的满二叉树节点编号为i的结点在二叉树中的位置完全相同,则这颗树,我们称之为完全二叉树。

    满二叉树一定是完全二叉树,完全二叉树不一定是满二叉树。

    哈夫曼树(Huffman Tree),又叫优二叉树,指的是对于一组具有确定权值的叶子结点的具有小带权路径长度(所有叶子结点路径长度的加权和)的二叉树。

    顺序存储

    完全二叉树顺序编号的所有左孩子都是偶数(2i),所有右孩子都是奇数(2i+1)

    链式存储

    定义存储结构

    typedef char DataType;
    
    typedef struct bnode
    {
         DataType data;
         struct bnode *left;
         struct bnode *right;
    } bitree;
    

      

    先序遍历(左-中-右):1,2,4,8,9,5,3,6,7

    中序遍历(中-左-右):8,4,9,2,5,1,6,3,7

    后序遍历(左-右-中):8,9,4,5,2,6,7,3,1

    层次遍历(宽度优先遍历):利用队列,依次将根,左子树,右子树存入队列,按照队列先进先出规则来实现层次遍历。1,2,3,4,5,6,7,8,9

    深度优先遍历:利用,先将根入栈,再将根出栈,并将根的右子树,左子树存入栈,按照先进后出规则来实现深度优先遍历。1,2,4,8,9,5,3,6,7

    class Node:  
        def __init__(self,value=None,left=None,right=None):  
             self.value=value  
             self.left=left    #左子树
             self.right=right  #右子树
    def preTraverse(root):  
        '''
        前序遍历
        '''
        if root==None:  
            return  
        print(root.value)  
        preTraverse(root.left)  
        preTraverse(root.right)  
     
    def midTraverse(root): 
        '''
        中序遍历
        '''
        if root==None:  
            return  
        midTraverse(root.left)  
        print(root.value)  
        midTraverse(root.right)  
      
    def afterTraverse(root):  
        '''
        后序遍历
        '''
        if root==None:  
            return  
        afterTraverse(root.left)  
        afterTraverse(root.right)  
        print(root.value)
        
    if __name__=='__main__':
        root=Node('D',Node('B',Node('A'),Node('C')),Node('E',right=Node('G',Node('F'))))
        print('前序遍历:')
        preTraverse(root)
        print('
    ')
        print('中序遍历:')
        midTraverse(root)
        print('
    ')
        print('后序遍历:')
        afterTraverse(root)
        print('
    ')
    

      广度优先(队列,先进先出)

    def BFS(self, root):
        '''广度优先'''
        if root == None:
            return
        # queue队列,保存节点
        queue = []
        # res保存节点值,作为结果
        #vals = []
        queue.append(root)
    
        while queue:
            # 拿出队首节点
            currentNode = queue.pop(0)
            #vals.append(currentNode.val)
            print(currentNode.val, end=' ')
            if currentNode.left:
                queue.append(currentNode.left)
            if currentNode.right:
                queue.append(currentNode.right)
        #return vals
    

      深度优先(栈,后进先出)

    def DFS(self, root):
        '''深度优先'''
        if root == None:
            return
        # 栈用来保存未访问节点
        stack = []
        # vals保存节点值,作为结果
        #vals = []
        stack.append(root)
    
        while stack:
            # 拿出栈顶节点
            currentNode = stack.pop()
            #vals.append(currentNode.val)
            print(currentNode.val, end=' ')
            if currentNode.right:
                stack.append(currentNode.right)
            if currentNode.left:
                stack.append(currentNode.left)
        #return vals
    

      

  • 相关阅读:
    一点小小的心得
    JavaScript的跳转脚本举例
    如何在Windows Server 2008 R2上开启Windows Power Shell ISE
    如何设置密码输错N次后自动锁住账户?
    IE的local intranet zone里有个URL删不掉, 怎么办?
    理解cookie机制
    ajaxpro.2.dll 简单应用
    cookie概述
    PetShop是如何兼容数据库的.NET教程,数据库应用
    .Net PetShop 4.0的分布式数据库设计.NET教程,.NET Framework
  • 原文地址:https://www.cnblogs.com/iupoint/p/11578052.html
Copyright © 2011-2022 走看看