zoukankan      html  css  js  c++  java
  • 94. Binary Tree Inorder Traversal (Java)

    Given a binary tree, return the inorder traversal of its nodes' values.

    Example:

    Input: [1,null,2,3]
       1
        
         2
        /
       3
    
    Output: [1,3,2]

    Follow up: Recursive solution is trivial, could you do it iteratively?

    法I:递归

    /**
     * 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) {
            if(root == null) return result;
            inorder(root);
            return result;
        }
        
        public void inorder(TreeNode root) {
            if(root.left!=null) inorder(root.left);
            result.add(root.val);
            if(root.right!=null) inorder(root.right); 
        }
        
        private List<Integer> result = new ArrayList<Integer>();
    }

    法II:循环。使用stack以及一个set标记当前节点是否访问过

    /**
     * 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 ArrayList<Integer>();
            Set<TreeNode> visitedSet = new HashSet<TreeNode>();//Set有HashSet和TreeSet两种实现
            if(root == null) return result;
            Stack<TreeNode> s = new Stack<TreeNode>();
            TreeNode curNode = root;
            while(true){
                if(visitedSet.contains(curNode)){ //如果访问过,访问右儿子
                    result.add(curNode.val);
                    curNode = curNode.right;
                }
    
                while(curNode!=null){ //如果没有访问过,自己先进栈,然后是左儿子         
                    s.push(curNode);
                    visitedSet.add(curNode);
                    curNode = curNode.left;
                }
                if(s.empty()) break;
                
                //出栈一个节点
                curNode = s.peek();
                s.pop();
            }
            
            return result;
        }
    }
  • 相关阅读:
    js append()和appendChild()和insertBefore()的区别
    webpack打包工具简单案例
    Vue $ref 的用法
    Vue学习笔记-作用域插槽
    Vue学习笔记-插槽基本使用
    Vue学习笔记-父子通信案例
    Echarts案例-折线图
    Echarts案例-柱状图
    软件构造实验三-递归下降分析分析法
    软件构造实验二-拷贝一个c文件 将其中的关键字int替换成float
  • 原文地址:https://www.cnblogs.com/qionglouyuyu/p/11224794.html
Copyright © 2011-2022 走看看