`
frank-liu
  • 浏览: 1666042 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Binary Tree Inorder Traversal

 
阅读更多

问题描述:

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

For example:
Given binary tree [1,null,2,3],

   1
    \
     2
    /
   3

 

return [1,3,2].

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

原问题链接:https://leetcode.com/problems/binary-tree-inorder-traversal/

 

问题分析

  这个问题属于一个比较典型的算法运用。在之前的文章里针对递归和非递归的过程都有过详细的讨论。这里中序遍历只是其中的一种情况。我们可以运用递归的方法和非递归的方法两种方式来解决。

 

递归解法

  这种方式非常简单,每次遍历一个节点的时候都是首先遍历它的左子节点,然后再遍历该节点,再接着遍历它的右子节点。按照这个递归关系,我们将保存最终结果的列表作为参数传入递归调用的函数中。每次在遍历处理具体元素的时候将元素加入到列表中就可以了。

  详细的代码实现如下:

 

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        inorder(list, root);
        return list;
    }
    
    private void inorder(List<Integer> list, TreeNode root) {
        if(root == null) return;
        if(root.left != null) {
            inorder(list, root.left);
        }
        list.add(root.val);
        if(root.right != null) {
            inorder(list, root.right);
        }
    }
}

 

非递归解法

  这种解法的思路也好理解。因为从递归的定义来说,每次碰到一个节点的时候都会优先的去看它的左子节点,所以从每碰到一个节点的时候我们就一直沿着这个节点的左子节点往前遍历。在遍历的过程中将碰到的节点都压入到栈中间。一直到该节点的左子节点已经是null了。

   这个时候我们从栈顶弹出这个元素来,因为它肯定就是我们要找的最左下的元素。访问了这个元素之后,我们将遍历的节点再指向当前访问元素的右子节点。这样就可以遍历完整个二叉树了。

  详细的代码实现如下:

 

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<Integer>();
        Stack<TreeNode> stack = new Stack<>();
        while(root != null || !stack.isEmpty()) {
            while(root != null) {
                stack.push(root);
                root = root.left;
            }
            if(!stack.isEmpty()) {
                root = stack.pop();
                list.add(root.val);
                root = root.right;
            }
        }
        return list;
    }
}
分享到:
评论

相关推荐

    94.Binary Tree Inorder Traversal二叉树的中序遍历【LeetCode单题讲解系列】

    94.Binary_Tree_Inorder_Traversal二叉树的中序遍历【LeetCode单题讲解系列】

    【LeetCode】102. Binary Tree Level Order Traversal

    我的个人微信公众号:Microstrong 微信公众号ID:MicrostrongAI 微信公众号介绍:Microstrong(小强)同学主要研究机器学习、深度学习、计算机视觉、智能对话系统相关内容,分享在学习过程中的...102. Binary Tree Leve

    105.construct binary tree from preorder and inorder traversal从前序和与中序遍历序列构造二叉树【LeetCode单题讲解系列】

    105.construct_binary_tree_from_preorder_and_inorder_traversal从前序

    leetcode530-leetcode:力扣在线评委

    leetcode 530 力扣在线评委 # 问题 困难 解决方案 1 简单的 2 中等的 3 中等的 12 中等的 22 中等的 ...Binary Tree ...Traversal ...Binary Tree Inorder Traversal 318. Maximum Product of Word Length

    dna匹配leetcode-leetcode:leetcode刷题

    Inorder Traversal 栈 递归 Single Number 异或 Copy List with Random Pointer 单链表 map Max Points on a Line 斜率 map, int&gt; Fraction to Recurring Decimal map long long 正负号 Repeated DNA S

    leetcode中文版-leetcode:leetcode

    leetcode中文版车鸟 一组用python编写的算法。 种类 冒泡排序 插入排序 归并排序 桶排序 ...binary_tree_inorder_traversal binary_tree_level_order_traversal binary_tree_level_order_traversal_I

    leetcode-tree

    144-Binary Tree Preorder Traversal94-Binary Tree Inorder Traversal145-Binary Tree Postorder Traversal(后续的非递归时间不够可以先跳过,有点难)层次遍历,队列辅助,相当于广搜。102-Binary Tree Level ...

    leetcode-[removed]使用Java的Leetcode解决方案

    105从Preorder和Inorder Traversal.js构造二叉树 106从有序和后置Traversal.js构造二叉树 107二叉树级订单遍历II.js 108将排序后的数组转换为Binary Search Tree.js 大多数Water.js的11个容器 110平衡Binary Tree....

    javalruleetcode-leetcode:解决方案

    java lru leetcode Leetcode Just want to push myself to ...里面并没有列出所有的题目的解法,只列出一些比较经典的 ...Inorder traversal + two pointers Time: O(n), Space: O(n) 3. BST iterator + stack Time: O(n),

    leetcode2sumc-Leetcode_questions:Leetcode_questions

    leetcode 2 和 c Leetcode_questions 目前拥有: 简单的: ...Traversal(c++:tree traversal inorder) 100.Same Tree(c++) 101.对称树(c++) 104.二叉树的最大深度(c++) 108.将排序数组转换为二叉搜索树

    lrucacheleetcode-beihu-leetcode:力扣算法

    前中后序(In-Order/Pre-Order/Post-Order) Breadth-first/Depth-first search 广度优先、深度优先 Divide and Conquer 分而治之 Dynamic Programming 动态规划 Binary Search 二分法查询 Graph 图 ​ 解题思路 明确...

    cpp-算法精粹

    Construct Binary Tree from Inorder and Postorder Traversal 二叉查找树 Unique Binary Search Trees Unique Binary Search Trees II Validate Binary Search Tree Convert Sorted Array to Binary Search Tree ...

    leetcode添加元素使和等于-Leetcode-tree:力码树

    Inorder Traversal 对于树的问题,大多数我们都会使用递归的方法。原因是树的左子树也是树,右子树也是树,使用递归的方法最简单快捷。这道题是需要我们用Inorder的顺序输出节点。inorder的顺序是先左再自己再右。...

    javalruleetcode-what_the_dead_men_say:what_the_dead_men_say

    Inorder 0099 Recover Binary Search Tree - Java Recursive 0101 Symmetric tree - Java Recursive - Java Iterative - C Recursive - Python Iterative 0102 Binary Tree Level Order Traversal - Python3 ...

    LeetCode最全代码

    * [Binary Search Tree](https://github.com/kamyu104/LeetCode#binary-search-tree) * [Breadth-First Search](https://github.com/kamyu104/LeetCode#breadth-first-search) * [Depth-First Search]...

    LeetCode-NoteBook:docsifyjs

    LeetCode笔记本docsifyjsLeetCode算法Java c / c ++ javascript的基本知识简单的1. Two Sum 704. Classical Binary Search2.... Binary Tree Inorder Traversal144. Binary Tree Preorder Traversal145. Binary Tree

    四平方和定理leetcode-leetcode-practice:个人LeetCode练习代码

    94.binary-tree-inorder-traversal (二叉树的中序遍历) 101.symmetric-tree (对称二叉树) 102.binary-tree-level-order-traversal (二叉树的层序遍历) 104.maximum-depth-of-binary-tree (二叉树的最大深度) 105....

    lrucacheleetcode-LeetCode_Note:leetcode个人笔记

    [105_construct-binary-tree-from-preorder-and-inorder-traversal.cpp] [106_construct-binary-tree-from-inorder-and-postorder-traversal.cpp] [107_binary-tree-level-order-traversal-ii.cpp] [108_convert-...

    leetcodetreenode-binary-tree-inorder-traversal:二叉树中序遍历

    leetcode 树节点 二叉树中序遍历 :evergreen_tree: 给定一棵二叉树,返回其节点值的中序遍历。 Example: Input: [1,null,2,3] 1 \ 2 / 3 Output: [1,3,2] 跟进:递归解决方案是微不足道的,你能迭代吗? 中序遍历: ...

    leetcode卡-arts:每周输出:Algorithm+Review+Tip+Share

    Algorithm:binary-tree-inorder-traversal Review:golang unit testing tool Tip:linux高级命令使用 Share:iptables 设置redis白名单 第二周 Algorithm:restore-ip-addresses(递归) Review:redis sentinel ...

Global site tag (gtag.js) - Google Analytics