• 二叉树


    平衡二叉树

      它是一棵空树或它的左右两个子树的高度差的绝对值不超过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
    

      

  • 相关阅读:
    Solution 16: 树的层次遍历
    Solution 15: 树的镜像
    Solution 14: Two Sum
    Solution 13: 链表的倒数第K个节点
    Solution 10: 翻转句子中的单词
    Solution 11: 二叉树中节点的最大距离
    Solution 9: 判断序列是否为BST的后续遍历结果
    Solution 7: 判断两链表是否相交
    估算Baidu和Google的网页索引数量之比
    主元素问题
  • 原文地址:https://www.cnblogs.com/iupoint/p/11578052.html
Copyright © 2020-2023  润新知