1、题目描述
二叉树的中序遍历(使用栈)
给定一个二叉树的根节点 root ,返回它的 中序 遍历。
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]
2、算法分析
① 二叉树的中序遍历,使用栈辨别二叉树的结点和集合List存储二叉树中结点的值
② 当栈不空,因为初始栈都是空的,说明栈中是存储元素的;当前结点不为空的时候遍历
③ 当当前结点不为空的时候,遍历其左孩子,然后入栈
④ 当当前结点为空的时候,从栈中出栈元素,继续遍历右孩子
3、代码实现
/**
* Definition for a binary tree node.
* 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;
* }
* }
*/
/*
二叉树的中序遍历
给定一个二叉树的根节点root,返回中序遍历
栈存储结点
集合存储的是结点中的元素
*/
import java.util.*;
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
// 定义一个集合存储树中的结点的值,注意返回的是List
List<Integer> list = new ArrayList<Integer>();
// 定义一个栈结构,存储的是树中结点
Stack<TreeNode> stack = new Stack<TreeNode>();
// 定义当前元素
TreeNode currentNode = root;
// 当栈不空,或者是根节点不空的时候,符合条件
// 因为初始栈都为空,存储元素后都需要遍历出来,所以判断栈不空
while(currentNode != null || !stack.isEmpty()){
// 当前元素不为空的时候
if(currentNode != null){
// 将当前元素进栈
stack.push(currentNode);
// 当前元素左孩子
currentNode = currentNode.left;
} else{
// 当前元素为空的时候,栈内出栈元素
currentNode = stack.pop();
// 将当前元素添加到集合中
list.add(currentNode.val);
// 判断出栈元素的右孩子
currentNode = currentNode.right;
}
}
return list;
}
}