二叉树的中序遍历题目的思路探讨与源码
二叉树的中序遍历的题目如下图,该题属于树结构和栈结构的题目,主要考察对于树本身结构的理解和认识,结合树的左右节点信息就可以进行求解。本文的题目作者想到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) ,但有可能是可以进一步提速的,希望朋友们能够多多指教,非常感谢。