知识储备--基础算法篇-二叉树

1.二叉树理论

1.1二叉树的种类

  1. 满二叉树:所有节点的数目等于2**k-1
  2. 完全二叉树:除了底层之外其他层都是的,最底层的节点是从左到右连续的。
  3. 二叉搜索树:左边子树的所有节点都小于中间节点,右边子树的所有节点都大于中间节点。并且左子树也是满足这个规律的。搜索数的时间复杂度为logN。
  4. 平衡二叉搜索树:左子树和右子树的深度差不能超过1。且左子树也符合这个规则。

1.2存储方式

  1. 链式存储:每个节点包括val和左右指针指向左右节点。
  2. 顺序存储:用一个数组来存储,数组中的值是二叉树的节点值,索引是从上到下,从左到右的顺序。比如:给你一个索引i,下标为i的节点的左子节点下标是2*i+1,右子节点下标是2*i+2

1.3遍历方式

  1. 深度优先搜索:深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树和图数据结构的算法。它从起始节点开始,沿着一条路径尽可能深入地探索,直到无法继续为止,然后回溯并尝试其他路径。DFS通常使用递归或栈数据结构来实现。前中后序遍历都是深度优先搜索。一般是递归法迭代法
  2. 广度优先搜索:广度优先搜索(Breadth-First Search,BFS)是一种用于遍历或搜索树和图数据结构的算法。与深度优先搜索不同,BFS从起始节点开始,首先探索其所有相邻节点,然后再逐层向外扩展。这意味着它会先访问离起始节点最近的节点,然后依次访问距离更远的节点。层序遍历是广度优先搜索。一般是迭代法。用队列(先进先出)来进行。

前序遍历的顺序是:中左右。

中序遍历是:左中右。

后序遍历是:左右中。 

其实表示的就是中在其中所处的位置。

知识储备--基础算法篇-二叉树_第1张图片

 2.算法题

2.1第94题-二叉树的中序遍历

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        # 中序遍历是左中右
        # 这是深度优先搜索dfs
        # 一般是递归法和迭代法
        def dfs(cur, value):
            if cur == None:
                return
            
            dfs(cur.left, value)
            value.append(cur.val)
            dfs(cur.right, value)
        
        value = []
        dfs(root, value)
        return value

知识储备--基础算法篇-二叉树_第2张图片

递归比较简单,主要还是要掌握迭代的做法。 

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def inorderTraversal(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        # 中序遍历是左中右
        # 这是深度优先搜索dfs
        # 一般是递归法和迭代法
        # 用迭代法
        # 栈,用来储存节点地址
        stack = []
        # 用来储存结果
        res = []
        while root or stack:
            # 先把左节点一直走到底
            if root:
                stack.append(root)
                root = root.left
            # 如果左节点都放入栈中了
            else:
                # 弹出栈中最上面的节点
                temp = stack.pop()
                # 储存该节点的值
                res.append(temp.val)
                # 将该节点的右子节点作为根节点遍历,如果没有右节点这个就是左,再次弹出最上面的节点,储存值,这个值是中,再以该节点的右子节点作为根节点,这个值是右。
                root = temp.right
            
        return res

知识储备--基础算法篇-二叉树_第3张图片 

你可能感兴趣的:(算法)