首先二叉树的遍历分为,深度优先遍历(dfs)、广度优先遍历(bfs)。
注意:但凡遍历都要注意根节点为 null;
深度优先遍历又分为前中后序遍历,前面文章都讲过了,递归三个语句换个位置就解决了。
注意:这里是深度优先遍历结果放在一个集合里 List
但凡是遍历,不论是深度(栈)、广度(队列),都是弹出一个再判断是否要塞(是否存在左右孩子)。
深度优先的迭代做法后序遍历就是把前序的 left 、 right 压入顺序反转一下,再把得到的 List
广度优先遍历(层序遍历):
递归(不推荐)方法利用 deep 控制深度。一个 if 判 root 空,一个 if(size < deep) 控制是否创建一个 List 存该深度的结点,resList.get(deep - 1).add(node.val);
最后两个递归完美收官。这里可以选择放入一个 List,也可以放入 List 中的 List,按需求来。
迭代法(墙裂推荐!):迭代法可以解决很多的遍历问题,而且很方便!主要就是利用队列,深度用循环来控制,条件为非空,那肯定是要不断有新的结点 offer 进来和 poll,这又要限制遍历一个深度再里面元素的次数了,这是又一个循环,这个循环不断进出,长度一直在变,所以要有个在内循环不变、外循环变化的 len 来控制内循环次数,每一次外循环都记录下该层深度的节点个数。
根据遍历返回树后有感
到这里才发现。自己对遍历的认识是多么浅,别人写遍历的时候是根据遍历写代码,我是根据递归的代码来想遍历。这样也未尝是件坏事,至少把递归的前中后序遍历死死记住了.
为什么前序求高度后序求深度?
因为前序先走到叶子节点再 add,而后序是从头结点一路吃过去。add 我称为吃。
其实理解递归/遍历 这样:
前序:中左右:中是吃的操作,左右都是遍历,这样就能很好的理解遍历为何先进这个而不是那个。
PS:堆是一棵完全二叉树,同时保证父子节点的顺序关系(有序)。 但完全二叉树一定是平衡二叉树,堆的排序是父节点大于子节点,而搜索树是父节点大于左孩子,小于右孩子,所以堆不是平衡二叉搜索树 。 持续更新中…… 如有错误,敬请斧正…..