题目描述:
解题思路:
两种方法
1、递归,这个很简单,先访问左子节点,然后访问根节点,最后访问右子节点。
直接上代码:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
return inOrderRecur(root, list);
}
public List<Integer> inOrderRecur(TreeNode root, List<Integer> list) {
if (root == null) {
return list;
}
inOrderRecur(root.left, list);
list.add(root.val);
inOrderRecur(root.right, list);
return list;
}
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
inorder(root, res);
return res;
}
public void inorder(TreeNode root, List<Integer> res) {
if (root == null) {
return;
}
inorder(root.left, res);
res.add(root.val);
inorder(root.right, res);
}
第二种是不用递归的方法,就是利用栈来实现
public List<Integer> inorderTraversal3(TreeNode root) {
//储存结果
List<Integer> list = new ArrayList<>();
//储存结点
Stack<TreeNode> stack=new Stack<>();
while (root != null || !stack.isEmpty()) {
//找当前节点的左子节点,一直找下去,直到为空为止
while (root != null) {
stack.push(root);
root = root.left;
}
//出栈,这个时候root变成了最左子节点
root=stack.pop();
//存入结果集中
list.add(root.val);
//访问完左子节点,访问右子节点
root=root.right;
}
return list;
}