准备面试,撸了个二叉树python的代码,最后有代码,记录梳理下写的思路:
目录
1-利用add创建一个二叉树
这里只做了按照完全二叉树进行构建树,之后会想想办法试着写一个支持非完全二叉树的(还没有思路)
核心思想:设定一个根节点,先设定左子节点在设定右子节点,设定完后表明该层任务结束,在新的节点中按照从左到右的顺序依次设为子节点
完全二叉树构建思路:
- 先设定现在的根节点,并将其放入节点列表
- 判断根节点的左子节点是否存在,不存在就把左节点更新为该节点,否则更新右节点
- 将上述更新的节点进行保存,如果上述更新的是右节点,证明该根节点已经完成任务,在节点列表中移除
- 将根节点设为节点列表中的第一个节点重复第一步
该方法就是每次增加一个节点需要遍历整棵树,然后再添加,优化办法是在类属性中加一个nowNode的选项保存最后一个节点
2-查询树的节点数
核心思想:每一次见到非空根节点先+1,这样保证记录所有根(父)节点的个数,记录下父节点的个数后,只剩下叶子节点没被记录下来,再记录下叶子节点的个数即可
- 空节点返回0
- 根节点不空就先+1
- 检查到叶子节点+1
- 采用递归法,分别查询左右树
3-查询树的深度
核心思想:每到一个根(父)节点,就将层数+1,并搜索该根(父)节点的左右子节点,如果子节点为空说明,该节点为叶子节点,返回当前的深度,然后返回每个根(父)节点下,左右树的深度最大值即可,注意,这里的深度作为一个参数在迭代过程中作为参数一直被记录。
- 节点为空就返回深度值
- 节点不为空就,深度+1
- 遍历左右树的深度值
- 返回左右树深度的最大值
4-前序遍历
前序遍历:根节点->左节点->右节点
核心思想:一直递归查询左节点是否存在,如果左节点存在就说明该节点是根(父)节点,则保存该值,如果是叶子节点,在保存该值的基础上,还要返回查询的结果,说明左边查询已经到底 (左节点和父节点查询完毕),返回到上一级刚好迭代查询右节点即可