题目描述
给出一棵二叉树,返回这棵树的中序遍历
例如:
给出的二叉树为{1,#,2,3},
返回[1,3,2].
备注:递归的解法太没有新意了,你能用迭代的方法来解这道题吗?
如果你不清楚“{1,#,2,3}"的含义的话,请继续阅读
我们用如下方法将二叉树序列化:
二叉树的序列化遵循层序遍历的原则,”#“代表该位置是一条路径的终结,下面不再存在结点。
例如:
上述的二叉树序列化的结果是:"{1,2,3,#,#,4,#,#,5}".
方法一:递归遍历
ArrayList<Integer> order = new ArrayList<Integer>();//存放遍历结果
public ArrayList<Integer> inorderTraversal (TreeNode root) {
inorderTraver(root);
return order;
}
public void inorderTraver(TreeNode root){
//中序遍历:左 根 右
if(root==null){//树为0
return;
}
if(root.left!=null){//左子树
inorderTraversal(root.left);
}
order.add(root.val); //根节点
if(root.right!=null){ //右子树
inorderTraversal(root.right);
}
}
方法二:非递归遍历
public ArrayList<Integer> inorderTraversal (TreeNode root) {
ArrayList<Integer> order = new ArrayList<Integer>();//存放遍历结果
if(root==null){
return order;
}
Stack<TreeNode> stack = new Stack<>();//栈
while(!stack.empty() || root!=null){
while(root!=null){//将左节点进栈
stack.push(root);
root = root.left;
}
TreeNode node = stack.pop();
order.add(node.val);
root = node.right;
}
return order;
}