数据结构与算法—— 树

1、树的定义

数据结构与算法—— 树_第1张图片
树可以分为:非空树和空树(节点数为0)。
下图为非空树:
数据结构与算法—— 树_第2张图片

数据结构与算法—— 树_第3张图片
数据结构与算法—— 树_第4张图片

1.1、节点之间的关系描述

1.2、节点、树的属性描述

数据结构与算法—— 树_第5张图片
树的高度为4,树的度为3
B C D节点的高度为3,深度为2。
K L M的深度为4,高度为1。
C节点的度为1,G节点的度为0

1.3、有序树V.S无序树

数据结构与算法—— 树_第6张图片

1.4、树和森林

数据结构与算法—— 树_第7张图片

1.5、树的基本性质

数据结构与算法—— 树_第8张图片

2、二叉树

2.1、二叉树的定义

2.1.1、基本概念

数据结构与算法—— 树_第9张图片

2.1.2、五种状态

数据结构与算法—— 树_第10张图片

2.1.3、几个特殊的二叉树

数据结构与算法—— 树_第11张图片
数据结构与算法—— 树_第12张图片
数据结构与算法—— 树_第13张图片

2.2、二叉树的存储结构

数据结构与算法—— 树_第14张图片

2.2.1、顺序存储

数据结构与算法—— 树_第15张图片
数据结构与算法—— 树_第16张图片
数据结构与算法—— 树_第17张图片

2.2.2、链式存储

数据结构与算法—— 树_第18张图片
数据结构与算法—— 树_第19张图片

2.3、二叉树的遍历

2.3.1、二叉树的先中后序遍历

数据结构与算法—— 树_第20张图片

例子:
数据结构与算法—— 树_第21张图片

数据结构与算法—— 树_第22张图片

2.3.2、二叉树的层次遍历

数据结构与算法—— 树_第23张图片
数据结构与算法—— 树_第24张图片

2.3.3、由遍历序列构造二叉树

数据结构与算法—— 树_第25张图片

数据结构与算法—— 树_第26张图片

2.3、线索二叉树

数据结构与算法—— 树_第27张图片
数据结构与算法—— 树_第28张图片

3、树

3.1树的结构

数据结构与算法—— 树_第29张图片

3.2、树和森林的遍历

数据结构与算法—— 树_第30张图片
数据结构与算法—— 树_第31张图片
数据结构与算法—— 树_第32张图片
数据结构与算法—— 树_第33张图片
数据结构与算法—— 树_第34张图片

3.2、二叉排序树

数据结构与算法—— 树_第35张图片
数据结构与算法—— 树_第36张图片
数据结构与算法—— 树_第37张图片

3.3、平衡二叉树

数据结构与算法—— 树_第38张图片

3.3.1、平衡二叉树的定义

数据结构与算法—— 树_第39张图片

3.3.1、调整最小平衡二叉树

数据结构与算法—— 树_第40张图片

3.4、哈夫曼树

数据结构与算法—— 树_第41张图片
数据结构与算法—— 树_第42张图片

3.4.1、定义

数据结构与算法—— 树_第43张图片

3.4.2、构造

数据结构与算法—— 树_第44张图片

4、python实现树以及遍历

定义一个节点类
class Node:
    """节点类"""
    def __init__(self, elem, left=None, right=None):
        self.elem = elem
        self.left = left
        self.right = right


class Tree:
    """树类"""
    def __init__(self, root=None):
        self.root = root


    # 增加节点
    def add(self,item):
        # 创建一个节点
        node = Node(item)
        if self.root is None:
            self.root = node
            return
        # 用一个队列存放根节点
        queue = [self.root]
        # 循环遍历数
        while queue:
            # 根节点出队列
            cur_node = queue.pop(0)
            # 当该节点没有左子树时,新节点连接到左边
            if not cur_node.left:
                cur_node.left = node
                return
            else:
                # 该节点存在左子树,将该左节点入队列
                queue.append(cur_node.left)
            # 当该节点没有右子树时,新节点连接到右边
            if not cur_node.right:
                cur_node.right = node
                return
            else:
                queue.append(cur_node.right)

    def breadth_trav(self):
        """广度遍历--层次遍历"""
        if self.root is None:
            return
        # 根节点队列
        queue = [self.root]
        # 循环遍历
        while queue:
            # 根节点出队
            cur_node = queue.pop(0)
            # 输出节点值
            print(cur_node.elem,end=" ")
            # 若该节点存在左节点
            if cur_node.left:
                # 将左节点入队
                queue.append(cur_node.left)
            if cur_node.right:
                queue.append(cur_node.right)

    def preorder(self,root):
        """深度先序递归遍历所有节点(递归)"""
        if root is None:
            return

        print(root.elem,end=" ")
        self.preorder(root.left)
        self.preorder(root.right)

    def depth_trav(self):
        """深度---先序遍历(迭代)"""
        if self._root is None:
            return
        # 根节点列表
        queue = [self._root]
        # 循环遍历
        while queue:
            # 取根节点
            cur_node = queue.pop()
            # 输出节点值
            print(cur_node.elem,end=" ")

            if cur_node.right:
                queue.append(cur_node.right)
            # 若该节点存在左节点
            if cur_node.left:
                # 将左节点入队
                queue.append(cur_node.left)

   
    def infix(self,root):
        """深度中序递归遍历所有节点(递归)"""
        if root is None:
            return

        self.infix(root.left)
        print(root.elem,end=" ")
        self.infix(root.right)

   
    def epilogue(self,root):
        """深度后序递归遍历所有节点(递归)"""
        if root is None:
            return

        self.epilogue(root.left)
        self.epilogue(root.right)
        print(root.elem,end=" ")


if __name__ == "__main__":
    tree = Tree()
    tree.add(1)
    tree.add(2)
    tree.add(3)
    tree.add(4)
    tree.add(5)
    tree.add(6)
    tree.add(7)
    tree.add(8)
    tree.breadth_trav()
    print(" ")
    tree.preorder(tree.root)
    print(" ")
    tree.infix(tree.root)
    print(" ")
    tree.epilogue(tree.root)

你可能感兴趣的:(数据结构,二叉树)