给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2]
法一 递归法
理解: List.addAll()
成功
执行用时 : 2 ms, 在Binary Tree Inorder Traversal的Java提交中击败了49.67% 的用户
内存消耗 : 34.2 MB, 在Binary Tree Inorder Traversal的Java提交中击败了59.14% 的用户
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if(root == null)
return res;
res.addAll(inorderTraversal(root.left) );
res.add(root.val);
res.addAll(inorderTraversal(root.right) );
return res;
}
}
法二,非递归,利用栈结构
(当-while, 若-if )
当前节点从根节点开始。
当当前节点不为空或栈不空
当当前节点不为空时,当前节点入栈,判断其是否有左节点。若有当前节点置为左节点,继续当前这一步;若无,则进行下一步。
若栈不为空,出栈,并将当前元素置为该出栈元素的右节点。
成功
执行用时 : 2 ms, 在Binary Tree Inorder Traversal的Java提交中击败了49.67% 的用户
内存消耗 : 34 MB, 在Binary Tree Inorder Traversal的Java提交中击败了71.52% 的用户
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
//List<Integer> res = new ArrayList<Integer>();
List<Integer> res = new ArrayList<>();
if(root == null)
return res;
//Stack<TreeNode> tmp = new Stack<TreeNode>();
Stack<TreeNode> tmp = new Stack<>();
TreeNode cur = root;
while(cur!=null || !tmp.empty() ){
while(cur != null){
tmp.push(cur);
cur = cur.left;
}
if(!tmp.empty() ){
cur = tmp.pop();
res.add(cur.val);
cur = cur.right;
}
}
return res;
}
}