栈-N94-二叉树的中序遍历

2019-03-27  本文已影响0人  三次元蚂蚁

题目

思路

  1. 查找第一个结点:由于中序遍历的顺序是:左子树->根->右子树,所以

    1. 如果根节点的左子树不为空,则第一个结点必定在该左子树中
    2. 如果该左子树为空,则第一个结点就是根节点
  2. 查找第二个结点:由于第一个结点的左子树必为空,所以

    1. 如果第一个结点的右子树不为空,则第二个结点必定在该右子树中,按照查找第一个结点的规律可以从该右子树中查找到第二个结点
    2. 如果该右子树为空,则第二个结点必定为第一个结点的根节点(如果第一个结点的根节点存在的话)
  3. 依次类推可以查找到所有结点

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result = new LinkedList<>();
        LinkedList<TreeNode> stack = new LinkedList<>();
        
        if (root == null) {
            return result;
        }
        
        boolean leftVisited = false;
        TreeNode top;
        stack.push(root);
        while (!stack.isEmpty()) {
            top = stack.peek();
            if (top.left == null || leftVisited) {
                result.add(top.val);
                stack.pop();
                if (top.right == null) {
                    leftVisited = true;
                } else {
                    stack.push(top.right);
                    leftVisited = false;
                }
            } else {
                stack.push(top.left);
                leftVisited = false;
            }
        }
        return result;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读