一、题目:94. 二叉树的中序遍历
二、题目解析:
解题思路:
根据二叉树中序遍历的特点,左中右,分别代码每个二叉树的左结点、根结点、右结点遍历即可。
-
解法一:最简单明了的就是使用递归函数,可参考视频:二叉树递归路径图解
-
解法二:通过栈来模拟递归,递归压栈的过程就是保存现场,保存当前的变量
图示帮助理解:
三、代码如下:
解法一(递归):
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = new ArrayList<Integer>();
inorder(root,ans);
return ans;
}
public void inorder(TreeNode treeNode,List<Integer> ans){
if(treeNode == null){
return;
}
inorder(treeNode.left,ans);
ans.add(treeNode.val);
inorder(treeNode.right,ans);
}
@Test
public void test(){
TreeNode left = new TreeNode(2,null,null);
TreeNode right = new TreeNode(3,null,null);
TreeNode treeNode = new TreeNode(1,left,right);
List<Integer> ans = inorderTraversal(treeNode);
System.out.println(ans.toString());
}
解法二(栈):
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ans = 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();
//加入当前值
ans.add(cur.val);
//考虑右子树
cur = cur.right;
}
return ans;
}
四、测试
五、结束