「力扣」第 94 题:二叉树的中序遍历(中等)


「力扣」第 94 题:二叉树的中序遍历(中等)

给定一个二叉树,返回它的中序 遍历。

示例:

输入: [1, null, 2, 3]
   1
    \
     2
    /
   3

输出: [1, 3, 2]

进阶:递归算法很简单,你可以通过迭代算法完成吗?

方法一:递归

Java 代码实现:

public class Solution {

    private List<Integer> result = new ArrayList<>();

    public List<Integer> inorderTraversal(TreeNode root) {
        inorder(root);
        return result;
    }

    private void inorder(TreeNode root) {
        if (root != null) {
            inorder(root.left);
            result.add(root.val);
            inorder(root.right);
        }
    }
}

方法二:非递归写法 1

Java 代码:

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
import java.util.Stack;

public class Solution {

    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        Deque<TreeNode> stack = new ArrayDeque<>();
        TreeNode currentNode = root;
        while (currentNode != null || !stack.isEmpty()) {
            while (currentNode != null) {
                stack.addLast(currentNode);
                currentNode = currentNode.left;
            }
            currentNode = stack.removeLast();
            res.add(currentNode.val);
            currentNode = currentNode.right;
        }
        return res;
    }
}

方法三:非递归写法 2

Java 代码实现:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int x) {
        val = x;
    }
}

enum UseType {
    RECURSION,
    ADD
}

class Command {
    UseType useType;
    TreeNode treeNode;

    Command(UseType useType, TreeNode treeNode) {
        this.useType = useType;
        this.treeNode = treeNode;
    }
}

/**
 * 什么是中序遍历,先递归遍历左子节点
 * 在处理自己
 * 然后再递归遍历右子节点
 */
public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null) {
            return result;
        }
        Stack<Command> stack = new Stack<>();
        stack.push(new Command(UseType.RECURSION, root));

        while (!stack.isEmpty()) {
            Command command = stack.pop();
            if (UseType.ADD == command.useType) {
                result.add(command.treeNode.val);
            } else {
                assert UseType.RECURSION == command.useType;
                if (command.treeNode.right != null) {
                    stack.push(new Command(UseType.RECURSION, command.treeNode.right));
                }
                stack.push(new Command(UseType.ADD, command.treeNode));
                if (command.treeNode.left != null) {
                    stack.push(new Command(UseType.RECURSION, command.treeNode.left));
                }
            }

        }
        return result;
    }
}

文章作者: liweiwei1419
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liweiwei1419 !
评论
 上一篇
「力扣」第 100 题:相同的树(简单) 「力扣」第 100 题:相同的树(简单)
「力扣」第 100 题:相同的树(简单) 中文网址:100. 相同的树 ; 英文网址:100. Same Tree , 给定两个二叉树,编写一个函数来检验它们是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同
下一篇 
「树」专题 6:二分搜索树中的问题 「树」专题 6:二分搜索树中的问题
「树」专题 6:二分搜索树中的问题回顾二分搜索树的定义二分搜索树的重要性质二分搜索树的重要性质如下,初学的时候经常会被忽略或者错误地理解: 左子树中所有的结点都小于当前结点; 右子树中所有的结点都大于当前结点。 以左右孩子为根的子树仍为二
  目录