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

    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?

    Approach #1: recurisive.

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        vector<int> inorderTraversal(TreeNode* root) {
            vector<int> ans;
            helper(root, ans);
            return ans;
        }
        
    private:
        void helper(TreeNode* root, vector<int>& ans) {
            if (root != NULL) {
                if (root->left != NULL) {
                    helper(root->left, ans);
                }
                ans.push_back(root->val);
                if (root->right != NULL) {
                    helper(root->right, ans);
                }
            }
        }
    };
    

    Runtime: 0 ms, faster than 100.00% of C++ online submissions for Binary Tree Inorder Traversal.

    Approach #2: Iteration with stack.[Java]

    /**
     * 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> res =  new ArrayList< > ();
            Stack<TreeNode> stack = new Stack< > ();
            TreeNode curr = root;
            while (curr != null || !stack.isEmpty()) {
                while (curr != null) {
                    stack.push(curr);
                    curr = curr.left;
                }
                curr = stack.pop();
                res.add(curr.val);
                curr = curr.right;
            }
            return res;
        }
    }
    Runtime: 1 ms, faster than 60.30% of Java online submissions for Binary Tree Inorder Traversal.

    Approach #3: Morris Traversal.[python] 

    # Definition for a binary tree node.
    # class TreeNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.left = None
    #         self.right = None
    
    class Solution(object):
        def inorderTraversal(self, root):
            """
            :type root: TreeNode
            :rtype: List[int]
            """
            res = []
            curr = root
            while curr:
                if not curr.left:
                    res.append(curr.val)
                    curr = curr.right
                else:
                    pre = curr.left
                    while pre.right:
                        pre = pre.right
                    pre.right = curr
                    temp = curr
                    curr = curr.left
                    temp.left = None
            return res            
                
    

    Runtime: 24 ms, faster than 40.09% of Python online submissions for Binary Tree Inorder Traversal.

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    ObjectiveC 日记⑦ 内存管理
    Jquery自定义分页插件
    C#中的静态类和静态成员
    多线程访问共同的代码或者对象:lock避免出错
    wordpress绑定新浪微博
    组态软件基础知识概述
    书籍推荐:《网站运营直通车:7天精通SEO》
    wordpress代码高亮插件推荐:AutoSyntaxHighlighter
    书籍推荐:《伟大是熬出来的:冯仑与年轻人闲话人生》
    wince平台用xml文件做配置文件
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9943581.html
Copyright © 2011-2022 走看看