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);
            }
        }
    }
    
  • 相关阅读:
    [Go] 实现websocket服务端
    [PHP] php使用event扩展的io复用测试
    [MySQL] 使用force index强制使用索引
    [Go] 使用net包作为tcp客户端读取http
    [Go] golang中的包管理
    [Go] 解决golang.org模块无法下载的问题
    [日常] linux设置环境变量
    [Go] golang定时器与redis结合
    [Go] golang定时器的使用
    [Linux] linux路由表
  • 原文地址:https://www.cnblogs.com/yfc0818/p/11072612.html
Copyright © 2011-2022 走看看