算法

LeetCode94. 二叉树的中序遍历

2021-09-16  本文已影响0人  Timmy_zzh
1.题目描述
示例 1:
输入:root = [1,null,2,3]
输出:[1,3,2]

示例 2:
输入:root = []
输出:[]

示例 3:
输入:root = [1]
输出:[1]

示例 4:
输入:root = [1,2]
输出:[2,1]

示例 5:
输入:root = [1,null,2]
输出:[1,2]
 
提示:
树中节点数目在范围 [0, 100] 内
-100 <= Node.val <= 100
2.解题思路:
    public void midTraversal(TreeNode node, List<Integer> res) {
        if (node == null) {
            return;
        }
        midTraversal(node.left, res);
        res.add(node.val);
        midTraversal(node.right, res);
    }
    public void midTraversal_v1(TreeNode node, List<Integer> res) {
        Stack<TreeNode> stack = new Stack<>();
        while (node != null || !stack.isEmpty()) {
            //1.先遍历到最左侧的叶子节点,并存放到stack中
            while (node != null) {
                stack.push(node);
                node = node.left;
            }
            //2.node为null,说明遍历到最左侧叶子节点了,从stack中取出元素,并从节点的右子节点开始从头遍历
            TreeNode pop = stack.pop();
            res.add(pop.val);
            //3.遍历右子节点
            node = pop.right;
        }
    }
public void midTraversal_molis(TreeNode root, List<Integer> res) {
    while (root != null) {
        if (root.left != null) {
            //1。寻找左子节点,并作为标记节点
            TreeNode exPoint = root.left;
            //一直遍历,直到标记节点的最右侧叶子节点
            while (exPoint.right != null && exPoint.right != root) {
                exPoint = exPoint.right;
            }
            //2。1。情况1,遍历找到最右侧叶子节点--添加辅助线指向根节点
            if (exPoint.right == null) {
                exPoint.right = root;
                root = root.left;
            } else {
                //2.2.情况2,遍历到辅助线 -- 断开辅助线,根节点添加到结果集合中,并将根节点指向右子节点
                res.add(root.val);
                exPoint.right = null;
                root = root.right;
            }
        } else {
            //3。遍历到最左侧叶子节点-根节点添加到结果集中,根节点指向右子节点
            res.add(root.val);
            root = root.right;
        }
    }
}
3.总结
上一篇下一篇

猜你喜欢

热点阅读