LeetCode刷题——二叉树的中序遍历#94#Medium

二叉树的中序遍历题目的思路探讨与源码
    二叉树的中序遍历的题目如下图,该题属于树结构和栈结构的题目,主要考察对于树本身结构的理解和认识,结合树的左右节点信息就可以进行求解。本文的题目作者想到2种方法,第一种方法是递归方法,第二种方法是入栈方法。其中第一种方法使用java写、第二种方法使用Python写,当然这可能不是最优的解法,还希望各位大佬给出更快的算法。
在这里插入图片描述
    本人认为该题目可以使用递归和入栈的方法,首先来说递归方法,对于树进行递归操作,递归阶数的标志是当前子树的根root是否为空,如果是空则结束递归;如果root不是空,则继续搜寻左子树,并将得到的根节点进行记录,然后再访问右子树进行寻找。所以按照这个思路我们的代码如下:

#喷火龙与水箭龟
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        searchNext(root, res);
        return res;
    }
    void searchNext(TreeNode root,List<Integer> res){
        if(root == null){
            return;
        }
        searchNext(root.left, res);
        res.add(root.val);
        searchNext(root.right, res);
    }
}

在这里插入图片描述
    显然,还可以使用入栈的方法来进行解决,使用一个列表来模拟栈的结构,把原来的树放到一个列表里面,对这个列表进行判断,只要不为空就继续执行,并且每次寻找先从左子树开始寻找,如果左子树不为空则可以继续寻找,并且将左子树的值加入到栈里面,然后把当前左子树的值记为根的值,并且弹出栈的末尾值,将弹出的值加入到结果列表里,然后判断弹出的值的右子树是否有值,如果有值则把当前值的右子树加入到原来的树对应的列表末尾,然后把弹出的值的右子树作为当前的根节点。所以根据这个步骤就可以写出代码,下面是Python代码部分:

#喷火龙与水箭龟
class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        if(root is None):
            return []
        resFinal = []
        stackList = [root]
        while(stackList):
            while(root.left):
                stackList.append(root.left)
                root = root.left
            flag = stackList.pop()
            resFinal.append(flag.val)
            if(flag.right):
                stackList.append(flag.right)
                root = flag.right
        return resFinal

在这里插入图片描述
    从结果来说java版本的递归还不错,但python版本的入栈的方法速度一般,因为时间复杂度其实是接近O(n^2) ,但有可能是可以进一步提速的,希望朋友们能够多多指教,非常感谢。

Guess you like

Origin blog.csdn.net/qq_26727101/article/details/116503999