1.中序遍历
1.递归:
public void inorder(TreeNode node, List<Integer> result){
if(node == null ) return;
inorder(node.left, result);
result.add(node.val);
inorder(node.right, result);
}
public List<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
inorder(root, result);
return result;
}
2. 迭代 栈
public List<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
ArrayDeque<TreeNode> stack = new ArrayDeque<>();
while(root != null || !stack.isEmpty()){
while(root != null){
stack.push(root);
root = root.left;
}
root = stack.pop();
result.add(root.val);
root = root.right;
}
return result;
}
3. Morris遍历
public List<Integer> inorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
TreeNode preNode = null;
while(root != null){
if(root.left != null){
preNode = root.left;
while(preNode.right != null && preNode.right != root){
preNode = preNode.right;
}
if(preNode.right == null ){
preNode.right = root;
root = root.left;
}
else{
result.add(root.val);
preNode.right = null;
root = root.right;
}
}
else{
result.add(root.val);
root = root.right;
}
}
return result;
}
空间O(1)
时间O(2n)
2.前序
1.Morris:
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
TreeNode p1 = root;
TreeNode p2 = null;
while(p1 != null){
p2 = p1.left;
if(p2 != null){
while(p2.right != null && p2.right != p1){
p2 = p2.right;
}
if(p2.right == null){
result.add(p1.val);
p2.right = p1;
p1 = p1.left;
continue;
}
else{
p2.right = null;
}
}
else{
result.add(p1.val);
}
p1 = p1.right;
}
return result;
}
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
ArrayDeque<TreeNode> stack = new ArrayDeque<>();
while(root != null || !stack.isEmpty()){
while(root != null){
result.add(root.val);
stack.push(root);
root = root.left;
}
root = stack.pop();
root = root.right;
}
return result;
}
private void preorder(TreeNode root, ArrayList<Integer> result) {
if(root == null) return;
result.add(root.val);
preorder(root.left, result);
preorder(root.right, result);
}
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<>();
preorder(root, result);
return result;
}
3.后序