算法分析 [树经典问题] 2019-03-18

四种遍历

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
一个输出节点,需要解决环问题

你可能感兴趣的:(算法分析 [树经典问题] 2019-03-18)