四种遍历
102. 二叉树的层次遍历列表 Binary Tree Level Order Traversal medium
法1. 时间复杂度O(n) 空间复杂度O(m)
非递归,BFS广度优先查找,使用队列
144. 二叉树的前序遍历 Binary Tree Preorder Traversal medium
法1. 时间复杂度O(n) 空间复杂度O(m)
递归,DFS 深度优先查找,需要回溯backtrace
法2. 时间复杂度O(n) 空间复杂度O(n/2)
非递归(类递归自己用stack实现递归),DFS 深度优先查找,使用Stack
,先储存node.val
,然后push(node.right)
,然后push(node.left)
,时间空间O(n/2)
法3. 时间复杂度O(n) 空间复杂度O(n/4)
非递归(采用半空间),DFS 深度优先查找,只存储right节点,使用Stack
,先储存node.val
,然后push(node.right)
,然后node=node.left
,时间空间O(n/4)
法3. 时间复杂度O(n) 空间复杂度O(1)
morris法
,将二叉树旋转成右下角斜线,使用左节点的right指针来记忆已经处理的节点
先获取左子树 最右节点, 然后输出 根节点, 并将 最右节点指向 根节点
通过 node.right = root 来确定已经输出过节点来向下指向
有两个输出节点
,需要解决环问题
94. 二叉树的中序遍历 Binary Tree Inorder Traversal medium
法1. 时间复杂度O(n) 空间复杂度O(m)
递归,DFS 深度优先查找,需要回溯backtrace
法2. 时间复杂度O(n) 空间复杂度O(n/2)
非递归(类递归自己用stack实现递归),DFS 深度优先查找,使用Stack
,先储存不断的push(node.left)
入栈左节点,然后逐个出栈node=stack.pop()
,将出栈信息rs.add(node.val)
,然后入栈右节点push(node.right)
,时间空间O(n/2)
法3. 时间复杂度O(n) 空间复杂度O(1)
morris法
,将二叉树旋转成右下角斜线
先快速旋转到最左节点,每个当前节点左节点的最右节点
都要指向当前节点,并将当前节点的左节点置空
每次向右走,碰到新的节点存在left节点,继续旋转
有一个输出节点
,需要解决环问题
145. 二叉树的后序遍历 Binary Tree Postorder Traversal hard
法1. 时间复杂度O(n) 空间复杂度O(m)
递归,DFS 深度优先查找,需要回溯backtrace
法2. 时间复杂度O(n) 空间复杂度O(n/2)
非递归(类递归自己用stack实现递归),DFS 深度优先查找,使用Stack
,后续遍历=前序遍历先从 right -> left
,得出的结果集进行反转Collections.reverse(rs)
法3. 时间复杂度O(n) 空间复杂度O(n/2)
morris法
,将二叉树旋转成右下角斜线
TODO
有一个输出节点
,需要解决环问题