三种基本traversal的递归和迭代解法
inorder traversal类的习题:
第一部分是BST Tree类的习题,例如:
530. Minimum Absolute Difference in BST
783. Minimum Distance Between BST Nodes
这两个问题一个规定所有node的值为非负,另一个没有规定,但在实际的case中都是非负的,所以cpp的答案可以先让 prev = -1
94. Binary Tree Inorder Traversal
//recursive solution, root.left->root->root.right
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
inorder(root, res);
return res;
}
private void inorder(TreeNode root, List<Integer> res) {
if (root == null) return;
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
//iterative solution
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.empty()) {
while (cur != null) {
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
res.add(cur.val);
cur = cur.right;
}
return res;
}
144. Binary Tree Preorder Traversal
//recursive solution, root->root.left->root.right
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
preorder(root, res);
return res;
}
private void preorder(TreeNode root, List<Integer> res) {
if (root == null) return;
res.add(root.val);
preorder(root.left, res);
preorder(root.right, res);
}
//iterative version
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while (cur != null || !stack.empty()) {
while (cur != null) {
res.add(cur.val);
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
return res;
}
145. Binary Tree Postorder Traversal
//recursive solution, root.left->root.right->root
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<>();
postorder(root, res);
return res;
}
private void postorder(TreeNode root, List<Integer> res) {
if (root == null) return;
postorder(root.left, res);
postorder(root.right, res);
res.add(root.val);
}
//iterative solution, use method addFirst() of LinkedList
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList res = new LinkedList<>();
if (root == null) return res;
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
stack.push(cur);
while (!stack.empty()) {
cur = stack.pop();
res.addFirst(cur.val);
if (cur.left != null) stack.push(cur.left);
if (cur.right != null) stack.push(cur.right);
}
return res;
}
105. Construct Binary Tree from Preorder and Inorder Traversal
//with HashMap
private int pre = 0;
private int in = 0;
public TreeNode buildTree(int[] preorder, int[] inorder) {
return build(preorder, inorder, Integer.MAX_VALUE);
}
private TreeNode build(int[] preorder, int[] inorder, int stop) {
if (pre == preorder.length)
return null;
if (inorder[in] == stop) {
in++;
return null;
}
TreeNode root = new TreeNode(preorder[pre++]);
root.left = build(preorder, inorder, root.val);
root.right = build(preorder, inorder, stop);
return root;
}
//without HashMap
public TreeNode buildTree(int[] preorder, int[] inorder) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < inorder.length; i++)
map.put(inorder[i], i);
return build(preorder, inorder, map, 0, preorder.length-1, 0, inorder.length-1);
}
private TreeNode build(int[] preorder, int[] inorder, Map<Integer, Integer> map, int preStart, int preEnd, int inStart, int inEnd) {
if (preStart > preEnd || inStart > inEnd) return null;
TreeNode root = new TreeNode(preorder[preStart]);
int rootIdx = map.get(root.val);
int leftNums = rootIdx - inStart;
root.left = build(preorder, inorder, map, preStart+1, preStart+leftNums, inStart, rootIdx-1);
root.right = build(preorder, inorder, map, preStart+leftNums+1, preEnd, rootIdx+1, inEnd);
return root;
}
106. Construct Binary Tree from Inorder and Postorder Traversal
//with HashMap
private int post = 0;
private int in = 0;
public TreeNode buildTree(int[] inorder, int[] postorder) {
post = postorder.length - 1;
in = inorder.length - 1;
return build(inorder, postorder, Integer.MAX_VALUE);
}
private TreeNode build(int[] inorder, int[] postorder, int stop) {
if (post < 0)
return null;
if (inorder[in] == stop) {
in--;
return null;
}
TreeNode root = new TreeNode(postorder[post--]);
root.right = build(inorder, postorder, root.val);
root.left = build(inorder, postorder, stop);
return root;
}
//with HashMap
public TreeNode buildTree(int[] inorder, int[] postorder) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < inorder.length; i++)
map.put(inorder[i], i);
return build(inorder, postorder, map, 0, postorder.length-1, 0, inorder.length-1);
}
private TreeNode build(int[] inorder, int[] postorder, Map<Integer, Integer> map, int postStart, int postEnd, int inStart, int inEnd) {
if (postStart > postEnd || inStart > inEnd)
return null;
TreeNode root = new TreeNode(postorder[postEnd]);
int rootIdx = map.get(root.val);
int leftNums = rootIdx - inStart;
root.left = build(inorder, postorder, map, postStart, postStart+leftNums-1, inStart, rootIdx-1);
root.right = build(inorder, postorder, map, postStart+leftNums, postEnd-1, rootIdx+1, inEnd);
return root;
}