LeetCode-94. 二叉树的中序遍历
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
思路
分为递归版本和非递归版本。
递归
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
/**
递归版本
*/
class Solution {
List<Integer> res=new ArrayList<>();
public List<Integer> inorderTraversal(TreeNode root) {
if(root==null)
{
return res;
}
res=(inorderTraversal(root.left));
res.add(root.val);
res=(inorderTraversal(root.right));
return res;
}
}
非递归
中序遍历的顺序是左根右,而我们只能从root开始,要么向左遍历,要么向右遍历。我们可以先一直向左遍历,直到某个叶子节点,然后将遍历过程中的所有节点存入一个栈中。
接下来要看看这个叶子节点的右子树,对它的右子树,我们依然按照上述步骤来一遍。
如果它没有右子树,就出栈,继续看这个出栈的节点有木有右子树。
用一个变量指针和一个栈就可以搞定。
/**
* 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>();
Stack<TreeNode> stack=new Stack<>();
TreeNode cur=root;
while(cur!=null || !stack.isEmpty())
{
while(cur!=null)
{
stack.push(cur);
cur=cur.left;
}
cur=stack.pop();
res.add(cur.val);
//复用指针,cur要么是空,如果不是空,就重复以上步骤,压入以cur为根的子树的所有左边节点。
//一个非空节点就能代表一棵树
cur=cur.right;
}
return res;
}
}