二叉树的中序遍历:在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。
递归的算法很简单:
package com.yshuoo.leetcode.stack;
import java.util.ArrayList;
import java.util.List;
/**
* @Author yangshuo
* @Date 2020/6/23 20:52
*
* 二叉树的中序遍历
* 给定一个二叉树,返回它的中序 遍历。
*
* 输入: [1,null,2,3]
* 1
* \
* 2
* /
* 3
*
* 输出: [1,3,2]
*/
public class InorderTraversal {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
find(root,list);
return list;
}
private void find(TreeNode treeNode, List<Integer> list){
if (treeNode == null){
return;
}
find(treeNode.left,list);
list.add(treeNode.val);
find(treeNode.right,list);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
递归是不可控的,所以我们需要可控的迭代法来避免可能发生的OOM异常
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<Integer>();
Set<TreeNode> set = new HashSet<TreeNode>();
if (root == null){
return list;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
while(root.left != null && !set.contains(root)){
root = root.left;
stack.push(root);
}
root = stack.pop();
list.add(root.val);
set.add(root);
if (root.right != null){
root = root.right;
stack.push(root);
}
}
return list;
}
在遍历过程中,需要防止左边重复遍历,所以设置一个set用于保存已经遍历过的值。
上面的写法有些冗余
public class Solution {
public List < Integer > inorderTraversal(TreeNode root) {
List < Integer > res = new ArrayList < > ();
Stack < TreeNode > stack = new Stack < > ();
TreeNode curr = root;
while (curr != null || !stack.isEmpty()) {
while (curr != null) {
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
res.add(curr.val);
curr = curr.right;
}
return res;
}
}