美文网首页
栈-N94-二叉树的中序遍历

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

作者: 三次元蚂蚁 | 来源:发表于2019-03-27 17:51 被阅读0次

题目

思路

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

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

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

  • 具体做法

  • 由于需要从左子树回退到根,所以考虑用栈来存储从根节点到第一个结点中经过的结点

  • 首先将根节点入栈

  • 重复观察栈顶元素直至栈为空

    1. 如果栈顶元素的左孩子为空或者已被访问过,则将栈顶元素出栈,放入中序遍历列表中

      1. 如果栈顶元素的右孩子为空,标记左孩子已被访问过

      2. 如果栈顶元素的右孩子不为空,则将栈顶元素的右孩子入栈,标记左孩子未被访问过

    2. 如果栈顶元素的左孩子不为空,则将栈顶元素的左孩子入栈,标记左孩子未被访问过

代码

/**
 * 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;
    }
}

相关文章

网友评论

      本文标题:栈-N94-二叉树的中序遍历

      本文链接:https://www.haomeiwen.com/subject/qartbqtx.html