问题
给定一个二叉树,返回它的中序 遍历。
例子
思路
- 递归 左结点遍历->添加val->右结点遍历
- 迭代 装Object的Stack 压栈顺序:右结点->new Integer(val)->左结点
- 迭代2
答案
//递归 O(n) T(n)=2T(n/2)+1
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
midOrder(root,list);
return list;
}
public void midOrder(TreeNode root, List<Integer> list) {
if (root==null) return ;
if (root.left!=null) midOrder(root.left,list);
list.add(root.val);
if (root.right!=null) midOrder(root.right,list);
}
}
//前中后通用迭代
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
if (root==null) return new ArrayList();
Stack stack = new Stack();
List<Integer> list = new ArrayList<>();
stack.push(root);
while(!stack.isEmpty()) {
//泛型 运行时看子类,动态绑定
if (stack.peek() instanceof TreeNode) {
//泛型,编译前类型检查,默认stack里是Object,所以要强转类型
TreeNode node = (TreeNode)stack.pop();
if (node.right!=null) stack.push(node.right);
stack.push(new Integer(node.val));
if (node.left!=null) stack.push(node.left);
} else {
list.add((Integer)stack.pop());
}
}
return list;
}
}
//迭代
if(root==null) return new ArrayList<Integer>();
List<Integer> list = new ArrayList<>();
Stack<TreeNode> s = new Stack<>();
//node为要放进栈的结点,先放进栈,然后再把结点全部取出来
TreeNode node = root;
while(s.size()>0 || node!=null) {
//如果结点不为空,把结点及其左结点都放入栈
if(node!=null) {
s.push(node);
node = node.left;
}else{//如果结点为空,弹出一个结点,将其值添加进list,此时以该结点为根的树只剩下右子树没有处理了
node = s.pop();
//对结点的操作
list.add(node.val);
//处理剩下的右子树
node = node.right;
}
}
return list;