本篇文章包含二叉树的相关操作:前,中,后序遍历(递归和迭代)的实现;二叉树的序列化和反序列化;根据前序和中序遍历还原二叉树;根据中序和后序遍历还原二叉树;
二叉树的遍历
前序遍历(根->左->右)
递归法
1 | private List<Integer> preorder(TreeNode root) { |
迭代法
算法思想:
(1)先将根节点插入栈中。
(2)若栈不为空,则将栈定元素出栈node
。
(3)将node
的值插入列表尾;若node.left!=null
,则将左节点压入栈;若node.right!=null
,则将右节点压入栈。递归至栈为空。
1 | private List<Integer> preorderIteration(TreeNode root) { |
中序遍历(左->根->右)
递归法
1 | private List<Integer> inorder(TreeNode root) { |
迭代法
算法思想:
(1)先将根节点插入栈中。
(2)循环将左节点都压入栈,将栈顶元素出栈node
,并将其值插入到列表尾。
(3)若当前节点node
的右节点node.right
不为空,这将其压入栈,并将root
指向node.right
,并循环执行(2)(3)至栈为空。
1 | private List<Integer> inorderIteration(TreeNode root) { |
后序遍历 (左->右->根)
递归法
1 | private List<Integer> postorder(TreeNode root) { |
迭代法
算法思想:
(1)先将根节点插入栈中。
(2)若栈不为空,则将栈定元素出栈node
。
(3)若node.left!=null
,则将左节点压入栈;若node.right!=null
,则将右节点压入栈。并将node
的值插入列表首。递归至栈为空。1
2
3
4
5
6
7
8
9
10
11
12
13private List<Integer> postorderIteration(TreeNode root) {
List<Integer> res = new ArrayList<>();
if (root == null) return res;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.empty()) {
TreeNode node = stack.pop();
if (node.left != null) stack.push(node.left);
if (node.right != null) stack.push(node.right);
res.add(0, node.val);
}
return res;
}
层序遍历
广度优先搜索
1 | private List<List<Integer>> levelOrder(TreeNode root) { |
深度优先搜索
1 | public List<List<Integer>> levelOrderDFS(TreeNode root) { |
二叉树的序列化和反序列化
1 | // Encodes a tree to a single string. |
根据前序遍历和中序遍历还原二叉树
1 | private TreeNode buildTreeHelper(int[] preorder, int p_start, int p_end, int[] inorder, int i_start, int i_end, HashMap<Integer, Integer> map) { |
根据后序遍历和中序遍历还原二叉树
1 | private static TreeNode dfsPostOrder(int[] inorder, int[] postorder) { |