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);
        }
    }
}
posted @ 2019-05-05 18:24  ayang818  阅读(215)  评论(0编辑  收藏  举报