zoukankan      html  css  js  c++  java
  • leetcode94 二叉树的中序遍历(递归和非递归版本)

    输入: [1,null,2,3]
       1
        
         2
        /
       3
    
    输出: [1,3,2]
    进阶: 递归算法很简单,你可以通过迭代算法完成吗?
    

    在这里插入图片描述
    题目说递归实现很简单,但是我只会用迭代算法算

    1.非递归版本

    通常树的遍历会使用到栈这一数据结构作为辅助,我的思路是先从根节点,在一个循环条件下(循环条件为栈非空(即该节点的上方还有未遍历的节点) or 节点本身非空),向左子树进行遍历并将节点入栈,然后当左子树遍历到底,也就是左子树为空的时候,一个节点弹出栈,并加入结果集,接着遍历该节点的右子树,进行之前前的操作。代码如下

    # 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]
            """
            stack = []
            result = []
            get_node = root
            while get_node or len(stack):
                if get_node:
                    stack.append(get_node)
                    get_node =get_node.left
                else:
                    get_node = stack.pop()
                    result.append(get_node.val)
                    get_node = get_node.right
            
            return result
    

    2.递归版本

    这个递归做法我不太会,不过我递归确实不太好。这是我在网上看到的题解,代码超级简单,就是直接递归到最左边和最右边了,感觉递归就像一个黑盒子,中间的过程我有点想不出来,但是就是出的来答案(修改于2019/2/13)
    现在差不多搞懂了二叉树中序遍历的递归实现,递归其实体现了分治的思想,就是把一个大的问题分解成许多个很容易解决的子问题。这里就是把一棵树转化为许多个可以容易得到的节点值,最后进行列表的拼接。
    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]
            """
    
            if not root:
                return [] 
            return self.inorderTraversal(root.left)+[root.val]+self.inorderTraversal(root.right)
    

    java代码如下

    class Solution {
        ArrayList<Integer> list = new ArrayList<>();
        public ArrayList<Integer> inorderTraversal(TreeNode root) {
            if (root == null) {
                return list;
            }
            helper(root);
            return list;
        }
        public void helper(TreeNode root) {
            if (root.left != null) {
                helper(root.left);
            }
            list.add(root.val);
            if (root.right != null) {
                helper(root.right);
            }
        }
    }
    
  • 相关阅读:
    移动端touch事件获取事件坐标
    详解webpack中的hash、chunkhash、contenthash区别
    textarea placeholder 设置主动换行
    js-xlsx的使用
    关于Blob对象的介绍与使用
    spring boot zuul集成kubernetes等第三方登录
    Spring Boot 获取yaml配置文件信息
    spring boot @Value源码解析
    java.lang.StackOverflowError解决
    Jpa 重写方言dialect 使用oracle / mysql 数据库自定义函数
  • 原文地址:https://www.cnblogs.com/yfc0818/p/11072612.html
Copyright © 2011-2022 走看看