Binary Tree Traversal
Traversal (#66, #67, #68)
Recursion
Recursion 模板
public class Solution {
public List<Integer> recursionTeraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
recursion(root, result);
return result;
}
private void recursion(TreeNode root, List<Integer> result) {
if (root == null) {
return;
}
result.add(root.val);
recursion(root.left, result);
recursion(root.right, result);
}
}
public List<Integer> recursionTeraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
recursion(root, result);
return result;
}
private void recursion(TreeNode root, List<Integer> result) {
if (root == null) {
return;
}
result.add(root.val);
recursion(root.left, result);
recursion(root.right, result);
}
}
1. Preorder (中左右)
public class Solution {public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
preorder(root, result);
return result;
}
private void preorder(TreeNode root, List<Integer> result) {
if (root == null) {
return;
}
result.add(root.val);
preorder(root.left, result);
preorder(root.right, result);
}
}
2. Inorder (左中右)
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
inorder(root, result);
return result;
}
private void inorder(TreeNode root, List<Integer> result) {
if (root == null) {
return;
}
inorder(root.left, result);
result.add(root.val);
inorder(root.right, result);
}
}
3. Postorder (左右中)
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<>();
postorder(root, result);
return result;
}
private void postorder(TreeNode root, List<Integer> result) {
if (root == null) {
return;
}
postorder(root.left, result);
postorder(root.right, result);
result.add(root.val);
}
}
Non-Recursion
Non-Recursion 模板
public class Solution {
public List<Integer> nonRecursionTeraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
List<Integer> result = new ArrayList<Integer>();
while (root != null || !stack.empty()) {
while (root != null) {
result.add(root.val);
stack.push(root);
root = root.left;
}
root = stack.pop();
result.add(root.val);
root = root.right;
}
Collections.reverse(result);
return result;
}
}
public class Solution {
public List<Integer> nonRecursionTeraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
List<Integer> result = new ArrayList<Integer>();
while (root != null || !stack.empty()) {
while (root != null) {
result.add(root.val);
stack.push(root);
root = root.left;
}
root = stack.pop();
result.add(root.val);
root = root.right;
}
return result;
}
}
1. Preorder (中左右)
public class Solution {public List<Integer> preorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
List<Integer> result = new ArrayList<Integer>();
while (root != null || !stack.empty()) {
while (root != null) {
result.add(root.val);
stack.push(root);
root = root.left;
}
root = stack.pop();
root = root.right;
}
return result;
}
}
2. Inorder (左中右)
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
List<Integer> result = new ArrayList<Integer>();
while (root != null || !stack.empty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
result.add(root.val);
root = root.right;
}
return result;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
List<Integer> result = new ArrayList<Integer>();
while (root != null || !stack.empty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
result.add(root.val);
root = root.right;
}
return result;
}
}
3. Postorder (左右中)
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<TreeNode>();
List<Integer> result = new ArrayList<Integer>();
while (root != null || !stack.empty()) {
while (root != null) {
result.add(root.val);
stack.push(root);
root = root.right;
}
root = stack.pop();
root = root.left;
}
Collections.reverse(result);
return result;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
List<Integer> result = new ArrayList<Integer>();
while (root != null || !stack.empty()) {
while (root != null) {
result.add(root.val);
stack.push(root);
root = root.right;
}
root = stack.pop();
root = root.left;
}
Collections.reverse(result);
return result;
}
}
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
TreeNode dummy = new TreeNode(0);
dummy.right = root;
Stack<TreeNode> stack = new Stack<>();
stack.push(dummy);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.right != null) {
node = node.right;
while (node != null) {
result.add(node.val);
stack.push(node);
node = node.left;
}
}
}
return result;
}
}
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
List<Integer> left = preorderTraversal(root.left);
List<Integer> right = preorderTraversal(root.right);
result.add(root.val);
result.addAll(left);
result.addAll(right);
return result;
}
}
Non-Recursion-2
Non-Recursion 模板 (例如:左中右是我们想看到的,即pop顺序,那相对的push顺序就应该是中左右,对于加入到result,划重点:先加入到result中,再push/pop)
public class Solution {
public List<Integer> nonRecursionTeraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
TreeNode dummy = new TreeNode(0);
dummy.right = root;
Stack<TreeNode> stack = new Stack<>();
stack.push(dummy);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.right != null) {
node = node.right;
while (node != null) {
result.add(node.val);
stack.push(node);
node = node.left;
}
}
if (!stack.isEmpty()) {
result.add(stack.peek().val);
}
}
Collections.reverse(result);
return result;
}
}
public List<Integer> nonRecursionTeraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
TreeNode dummy = new TreeNode(0);
dummy.right = root;
Stack<TreeNode> stack = new Stack<>();
stack.push(dummy);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.right != null) {
node = node.right;
while (node != null) {
result.add(node.val);
stack.push(node);
node = node.left;
}
}
if (!stack.isEmpty()) {
result.add(stack.peek().val);
}
}
}
}
1. Preorder (中左右)
public class Solution {public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
TreeNode dummy = new TreeNode(0);
dummy.right = root;
Stack<TreeNode> stack = new Stack<>();
stack.push(dummy);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.right != null) {
node = node.right;
while (node != null) {
result.add(node.val);
stack.push(node);
node = node.left;
}
}
}
return result;
}
}
2. Inorder (左中右)
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
// write your code here
ArrayList<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
TreeNode dummy = new TreeNode(0);
dummy.right = root;
Stack<TreeNode> stack = new Stack<>();
stack.push(dummy);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.right != null) {
node = node.right;
while (node != null) {
stack.push(node);
node = node.left;
}
}
if (!stack.isEmpty()) {
result.add(stack.peek().val);
}
}
return result;
}
}
public List<Integer> inorderTraversal(TreeNode root) {
// write your code here
ArrayList<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
TreeNode dummy = new TreeNode(0);
dummy.right = root;
Stack<TreeNode> stack = new Stack<>();
stack.push(dummy);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.right != null) {
node = node.right;
while (node != null) {
stack.push(node);
node = node.left;
}
}
if (!stack.isEmpty()) {
result.add(stack.peek().val);
}
}
return result;
}
}
3. Postorder (左右中)
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
TreeNode dummy = new TreeNode(0);
dummy.left = root;
Stack<TreeNode> stack = new Stack<>();
stack.push(dummy);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.left != null) {
node = node.left;
while (node != null) {
result.add(node.val);
stack.push(node);
node = node.right;
}
}
}
Collections.reverse(result);
return result;
}
}
public List<Integer> postorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
TreeNode dummy = new TreeNode(0);
dummy.left = root;
Stack<TreeNode> stack = new Stack<>();
stack.push(dummy);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node.left != null) {
node = node.left;
while (node != null) {
result.add(node.val);
stack.push(node);
node = node.right;
}
}
}
Collections.reverse(result);
return result;
}
}
Divide Conquer
Divide Conquer 模板
public class Solution {
public List<Integer> divideConquerTeraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
List<Integer> left = divideConquerTeraversal(root.left);
List<Integer> right = divideConquerTeraversal(root.right);
result.add(root.val);
result.addAll(left);
result.addAll(right);
return result;
}
}
public class Solution {
public List<Integer> divideConquerTeraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
List<Integer> left = divideConquerTeraversal(root.left);
List<Integer> right = divideConquerTeraversal(root.right);
result.addAll(left);
result.addAll(right);
return result;
}
}
1. Preorder (中左右)
public class Solution {public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
List<Integer> left = preorderTraversal(root.left);
List<Integer> right = preorderTraversal(root.right);
result.add(root.val);
result.addAll(left);
result.addAll(right);
return result;
}
}
2. Inorder (左中右)
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
List<Integer> left = inorderTraversal(root.left);
List<Integer> right = inorderTraversal(root.right);
result.addAll(left);
result.add(root.val);
result.addAll(right);
return result;
}
List<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
List<Integer> left = inorderTraversal(root.left);
List<Integer> right = inorderTraversal(root.right);
result.addAll(left);
result.add(root.val);
result.addAll(right);
return result;
}
}
3. Postorder (左右中)
public class Solution {
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
List<Integer> left = postorderTraversal(root.left);
List<Integer> right = postorderTraversal(root.right);
result.addAll(left);
result.addAll(right);
result.add(root.val);
return result;
}
List<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
List<Integer> left = postorderTraversal(root.left);
List<Integer> right = postorderTraversal(root.right);
result.addAll(left);
result.addAll(right);
result.add(root.val);
return result;
}
}
Comments
Post a Comment