二叉树的三种遍历方式(递归/非递归)
时间复杂度为O(n)
额外空间复杂度均为O(h) h为树的高度
递归版:
非递归版:
后序遍历的非递归(用2个栈):
后序遍历的非递归(用1个栈):
在二叉树中找到一个节点的后继节点:
思路: 中序遍历 左根右
主要考虑两种情况(有无右孩子节点)
如果该节点 有右孩子节点 , 则是右孩子节点中的最左孩子节点。
没有右孩子节点---则找父节点----直到找到是其父节点左孩子的节点
存在特殊情况: 如果node是整棵二叉树的最后一个节点---则在逐步往上走父节点的时候----可能会走到根节点--- 根节点的父节点为null (有判断父节点是否为空)----所以最后一个节点的后继节点为null
如果题目改为求 一个节点的前驱结点:
考虑 是否有 左孩子节点 ---- 如果 有左孩子节点 ---则前驱结点就是左孩子节点最右节点
如果没有左孩子节点---则往上追溯--只要父节点是当前节点的右孩子即可
二叉树的序列化和反序列化:
按照先序遍历的思路(递归式)
序列化:
反序列化:
按照层序遍历的思路(非递归式)
序列化:
反序列化:
判断一棵二叉树是否是平衡二叉树?
解决这个问题:我们需要充分利用递归的特点
判断一个节点是否平衡 需要获取的信息有: 左平 右平 左高 右高
定义 需要返回的内容信息(是否平衡+ 高度):
开始递归函数的逻辑:
主函数逻辑:
判断一棵树是否是搜索二叉树,判断一棵树是否为完全二叉树?
思路:
搜索二叉树
是 : 根节点的左子树值<根节点的值 右子树的值>根节点的值
所以想到 中序遍历的结果如果是 升序的 则证明是一个二叉搜索树