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);
}
}
}