zoukankan      html  css  js  c++  java
  • LeetCode94 Binary Tree Inorder Traversal(迭代实现) Java

    题目:
    Given a binary tree, return the inorder traversal of its nodes’ values.

    For example:
    Given binary tree {1,#,2,3},

       1
        
         2
        /
       3

    return [1,3,2].

    分析:
    中根遍历二叉树,也就是说,对树中的不论什么一个节点,先訪问其左子树,再訪问根节点,最后訪问其右子树。通过迭代的方式实现中根遍历二叉树,须要借助栈。

    在遍历二叉树前,须要做点准备工作:包装每个树节点。包装后的节点中。除了树节点本身。还有还有一个域,用于指示这个节点的左子树是否已经被訪问过了。

    算法的详细过程是这种:
    (1)把根节点入栈
    (2)进入循环。循环中是这种,当栈非空时,看看栈顶节点的左孩子是否存在,假设存在且没有被訪问过。就把它的左孩子入栈,否则,就把该节点弹栈,訪问该节点,并看看它的右孩子是否存在。假设存在,就把它的右孩子入栈。

    详细代码例如以下:

        public List<Integer> inorderTraversal(TreeNode root) {
            List<Integer> resultList = new ArrayList<Integer>();
            if (root == null) {
                return resultList;
            }
            LinkedList<TreeNodeWithFlag> stack = new LinkedList<>();
            stack.push(new TreeNodeWithFlag(root, false));
            while (!stack.isEmpty()) {
                TreeNodeWithFlag temp = stack.peek();
                if (temp.getTreeNode().left != null && !temp.flag) {
                    stack.push(new TreeNodeWithFlag(temp.getTreeNode().left, false));
                    // 当temp再次处于栈顶时。它的左子树必然已经被訪问过了
                    temp.setFlag(true);
                } else {
                    resultList.add(temp.getTreeNode().val);
                    stack.pop();
                    if (temp.getTreeNode().right != null) {
                        stack.push(new TreeNodeWithFlag(temp.getTreeNode().right, false));
                    }
                }
            }
    
            return resultList;
        }
    
        private static class TreeNodeWithFlag {
            private TreeNode treeNode;
            // 表示该节点的左子树是否被訪问过
            private boolean flag;
    
            private TreeNodeWithFlag(TreeNode treeNode, boolean flag) {
                super();
                this.treeNode = treeNode;
                this.flag = flag;
            }
    
            public TreeNode getTreeNode() {
                return treeNode;
            }
    
            public void setTreeNode(TreeNode treeNode) {
                this.treeNode = treeNode;
            }
    
            public boolean isFlag() {
                return flag;
            }
    
            public void setFlag(boolean flag) {
                this.flag = flag;
            }
    
            @Override
            public String toString() {
                return "TreeNodeWithFlag [treeNode=" + treeNode + ", flag=" + flag
                        + "]";
            }
    
        }
  • 相关阅读:
    122. Best Time to Buy and Sell Stock II
    121. Best Time to Buy and Sell Stock
    72. Edit Distance
    583. Delete Operation for Two Strings
    582. Kill Process
    indexDB基本用法
    浏览器的渲染原理
    js实现txt/excel文件下载
    git 常用命令
    nginx进入 配置目录时
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7352814.html
Copyright © 2011-2022 走看看