目录
1.题目内容
给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [1]
输出:[1]
2.用递归实现中序遍历
2.1解题思路
此方法作用为将二叉树进行中序遍历,即左根右。将每一个节点都套用此方法,先递归的访问左子树,再访问根节点,最后递归的访问右子树。
2.2代码
public void inOrder(TreeNode root){
if(root==null){
return;
}
//递归的访问左子树
inOrder(root.left);
//输出根节点
System.out.print(root.val+" ");
//递归的访问右子树
inOrder(root.right);
}
3.用迭代实现中序遍历
3.1解题思路
中序遍历:左根右
先递归的访问左子树,然后输出根节点,再递归的访问右子树。当某个节点被第二次访问时,可以弹出。(例如:从节点A开始访问左子树,这里第一次访问A,左子树访问完毕后,返回A,第二次访问A,可以弹出)
1.引入一个cur引用,先递归的访问左子树,把左子树走到头,节点入栈。
2.此时栈顶D的左右子树都为空,弹出节点D。栈顶变为B ,第二次访问B,弹出节点B。然后将B的右子树入栈。E的左子树为空,将E出栈,继续访问E的右子树。
3.H入栈,H的左右子树都为空,将H出栈。此时A的左子树遍历完毕,将A出栈。
4.再递归的遍历右子树。同上过程。
3.2代码(有详细注释)
public List<Integer> inorderTraversal(TreeNode root){
//先建立一个整形动态数组
List<Integer>list=new ArrayList<>();
//base case
if(root==null){
return list;
}
//最开始引用指向root
TreeNode cur=root;
//构建一个栈(双端队列)
Deque<TreeNode>stack=new LinkedList<>();
//循环终止条件:cur不为空或者栈不为空
while(cur!=null || !stack.isEmpty()){
//先不断的向左走到头
while(cur!=null){
stack.push(cur);
cur=cur.left;
}
//此时cur==null,栈顶存放了第一个要输出的节点
//当前栈顶为第一个左树为空的节点
cur=stack.pop();
//将节点值添加到数组中
list.add((int)cur.val);
//继续访问右子树
cur=cur.right;
}
return list;
}
补充