题目
中序遍历:中序遍历
题解
递归
思路:创建一个list集合用来将遍历的节点存到集合当中,按照中序遍历的特点,先遍历左子树,直到遍历到节点为null,再依次将节点存入到list集合,左子树遍历完,将root节点加入集合,再遍历右子树所有节点
/**
* 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;
* }
* }
*/
class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
//创建list集合 用来存储取到的树节点
List<Integer> res = new ArrayList<>();
inorder(res,root);
return res;
}
/**
* 中序遍历 按照左中右的顺序遍历
* @param res
* @param root
*/
private static void inorder(List<Integer> res, TreeNode root) {
//如果遍历到了叶子结点后为null,代表左子树或右子树遍历完成
if (root == null) {
return ;
}else {
//遍历左子树
inorder(res, root.left);
//添加根节点
res.add(root.val);
//遍历右子树
inorder(res, root.right);
}
}
}
迭代(栈)
思路:先设置一个总循环确保所有的节点都入栈,再设置一个循环确保每次都能把左节点先入栈。随后把这个左节点出栈来表示这个节点已经中序排序结束,一级一级出栈,然后才轮到右侧节点。
public static List<Integer> inorderTraversal(TreeNode root) {
//创建list集合 用来存储取到的树节点
List<Integer> res = new ArrayList<>();
inorder2(res,root);
return res;
}
/**
* 迭代法 栈
* @param res
* @param root
*/
private static void inorder2(List<Integer> res, TreeNode root) {
// 迭代遍历 通过压栈和出栈来模拟递归过程 本质和上面的递归是一样的
//创建栈
Deque<TreeNode> stack = new LinkedList<>();
//设置循环 在root节点或栈不为空的情况下遍历
while (!stack.isEmpty() || root != null) {
//设置不断遍历左子树的循环
while (root != null) {
//左子树节点不为null 压栈
stack.push(root);
root = root.left;
}
// 存在节点为空 此时栈中从栈顶的元素一定为子树的最左边一个子节点
root = stack.pop();
res.add(root.val); // 将子节点存入列表中
root = root.right; //访问右节点
}
}