二叉树先序,中序,后序遍历
递归
迭代
前序:cur指向root,将cur.val追加到res中,将root入栈,然后将cur指向cur.left,左子节点遍历完,将root出栈,cur指向right,继续遍历,尾部追加
中序:cur指向root,将root入栈,将cur指向cur.left,然后将cur.left入栈,直到遍历到左子节点最深处,pop出栈,追加到res中,然后再将cur指向右子节点,继续遍历
后续:前序的反面,cur指向root,将cur.val头部插入,然后将root入栈,然后将cur指向cur.right,右子节点遍历完,将root出栈,cur指向left,继续遍历,头部插入
二叉树层序遍历
思路:利用queue先进先出原则,将root放入,然后pop出来,再将left和right放入
运行结果
假如需要将每层内容单独统计出来,需要加一个list用来保存每层数据,遍历次数由queue的长度决定
二叉树Z字形层序遍历
思路:层序遍历的思路,用一个值判断是否是偶数,用deque append和appenleft改变值插入的顺序
二叉树镜像
思路:用一个栈来存放root,然后将左右节点放入,交换,然后弹出,最后返回root
二叉树深度
思路:层序遍历,统计层数
思路:递归,root节点的深度为左子节点和右子节点最大高度+1
二叉树翻转
思路:和二叉树深度结合实现
合并二叉树
思路:使用递归思路
二叉树多个节点的最近公共祖先
思路:使用递归算法,假如root为p或者q或者空,直接返回root
然后递归计算左子节点和右子节点
当左右子节点都为空,说明没有公共祖先
当左边不为空,右边为空,说明p和q都不在左子树中
当都不为空,说明分别在root的左右两侧