C C++最全【算法】二叉树的遍历指南(前序、中序、后序、层序,《C C++面试题及解析》分享给大家

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

在关系型数据库(如Mysql)中,通常会采用B+树作为索引结构。B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。


🍒2.3.3  决策树

在机器学习领域,决策树是一个非常经典的算法。决策树是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。

由于这种决策分支画成图形很像一棵树的枝干,故称决策树。

🎄🎄🎄我是分割线🎄🎄🎄

🍓3 二叉树的定义


🍊3.1 二叉树的定义

二叉树(Binary tree)是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。

在下面这副图中,F就是这棵二叉树的根节点,其左、右孩子节点分别为C、E。


🍊3.2 二叉树类

借鉴力扣中二叉树类的定义:

class TreeNode:
    def __init__(self,val,left=None,right=None):
        self.val=val
        self.left=left
        self.right=right

🍊3.3 构造方法

在python中,可以采用递归构造方法快速构造一颗二叉树

"""tree
            5
        1       2
    3     4   6    8
9                     11
"""

# 推荐采用这种构造方式,非常直观
root=TreeNode(5,
              TreeNode(1,
                       TreeNode(3,
                                TreeNode(9),
                                None),
                       TreeNode(4)
                       ),
              TreeNode(2,
                       TreeNode(6),
                       TreeNode(8,
                                None,
                                TreeNode(11))
                       )
              )

🎄🎄🎄我是分割线🎄🎄🎄

🍓4 二叉树的前序遍历


# 递归解法

def preorder(root):
    if not root:return
    print(root.val)
    preorder(root.left)
    preorder(root.right)

注意观察res的变化状况与树的遍历过程!

🎄🎄🎄我是分割线🎄🎄🎄

🍓5 二叉树的中序遍历


# 递归解法

def inorder(root):
    if not root:return
    inorder(root.left)
    print(root.val)
    inorder(root.right)

注意观察res的变化状况与树的遍历过程!

🎄🎄🎄我是分割线🎄🎄🎄

🍓6 二叉树的后序遍历


# 递归解法

def postorder(root):
    if not root:return
    postorder(root.left)
    postorder(root.right)
    print(root.val)

注意观察res的变化状况与树的遍历过程!

🎄🎄🎄我是分割线🎄🎄🎄

🍓7 前、中、后序遍历总结


前序、中序、后序遍历其实都是深度优先思想的体现,我这里采用递归写法,便于记忆,三者的区别在于:遍历左右子树与对此节点做出操作(print(root.val))的顺序

对比三种算法,大家可以很清晰地找到他们唯一的不同点:print()函数与两个递归的先后执行顺序。

总结以下,可以发现

(大家可以通过点击tag进入力扣练习题目哦~)

🎄🎄🎄我是分割线🎄🎄🎄

🍓8 BFS:二叉树的层序遍历


def bfs(root):
    queue=[root]
    while queue:
        node=queue.pop(0)
        if node.left:
            queue.append(node.left)
        if node.right:
            queue.append(node.right)
        print(node.val)

层次遍历很好理解,就是从根节点开始,一层一层,从上到下,每层从左到右,依次写值就可以了

🎄🎄🎄我是分割线🎄🎄🎄

🍓9 DFS:深度优先搜索


def dfs(root):
    stack=[root]
    while stack:
        node=stack.pop()
        if node.right:
            stack.append(node.right)
        if node.left:
            stack.append(node.left)
        print(node.val)

DFS与BFS类似,只不过是用栈而不是队列进行辅助

注意深度优先的栈的先入后出特性,应先判断right再判断left

🎄🎄🎄我是分割线🎄🎄🎄

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

是分割线🎄🎄🎄

[外链图片转存中…(img-GydYMih7-1715703310732)]
[外链图片转存中…(img-E0hxj924-1715703310732)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
叉树的遍是计算机科学对二叉树节点进行访问的一种方法,主要有三种基本方式:和后。每种遍都有其特定的节点访问顺: 1. **(Preorder Traversal)**: - 遍是:根节点 -> 左子树 -> 右子树 - C语言代码示例: ```c void preorderTraversal(TreeNode* root) { if (root != NULL) { printf("%d ", root->val); // 先访问根节点 preorderTraversal(root->left); // 再遍左子树 preorderTraversal(root->right); // 最后遍右子树 } } ``` 2. **(Inorder Traversal)**: - 遍是:左子树 -> 根节点 -> 右子树 - C语言代码示例: ```c void inorderTraversal(TreeNode* root) { if (root != NULL) { inorderTraversal(root->left); // 先遍左子树 printf("%d ", root->val); // 再访问根节点 inorderTraversal(root->right); // 最后遍右子树 } } ``` 3. **后(Postorder Traversal)**: - 遍是:左子树 -> 右子树 -> 根节点 - C语言代码示例: ```c void postorderTraversal(TreeNode* root) { if (root != NULL) { postorderTraversal(root->left); // 先遍左子树 postorderTraversal(root->right); // 再遍右子树 printf("%d ", root->val); // 最后访问根节点 } } ``` 在这些函数,`TreeNode`是一个假设的结构体或类,表示二叉树的节点,包含一个整数值`val`和指向左右子节点的指针。 **相关问--:** 1. 的应用场景是什么? 2. 常用于什么情况? 3. 后有何特点?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值