94. 二叉树的中序遍历(Python、Java)

1 题目

链接:二叉树的中序遍历

给定一个二叉树,返回它的中序遍历(左根右)。

示例:

输入: [1,null,2,3]
1
 \
  2
 /
3

输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?

2 Python

2.1 方法一:迭代(即循环)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        stack = []
        ans = []
        while root or stack:
            if root: #只要节点非空
                stack.append(root) #这里要加入的是树,不是树的值
                root = root.left
            else:
                root = stack.pop()
                ans.append(root.val) #树才有val和right
                root = root.right #左节点寻找完毕
        return ans

首先先达到root的最左端的左节点的位置,用stack记录经过所有节点,然后开始stack出栈,得到上一级节点的值,并加入ans,接着访问右节点,若为空,temp继续出栈,得到上上级节点,以此类推,最后stack为空,并且此时达到最右端的右节点

注:stack.append(root),这里加的是root,不是root.val

2.2 方法二:递归

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        ans = []
        
        if not root:
            return ans
        else:
	        ans += self.inorderTraversal(root.left)            
	        ans += [root.val]
	        ans += self.inorderTraversal(root.right)
        
        return ans

二叉树的中序遍历:左根右
N叉树的前序遍历:根左右
N叉树的后序遍历:左右根

3 Java

3.1 方法一(递归)

先放一个错误案例,错误原因是 list 的 .addAll(另一list) 方法括号内不能是null,.add() 方法括号内可以为null
所以当 root = null,返回值不应为null,应为空 list

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        if(root == null)    return null;
        List<Integer> ans = new LinkedList<Integer>();

        ans.addAll(inorderTraversal(root.left));	// 报错行
        ans.add(root.val);
        ans.addAll(inorderTraversal(root.right));
        return ans;
    }
}

修改后

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new LinkedList<Integer>();
        if(root == null)    return ans;

        ans.addAll(inorderTraversal(root.left));
        ans.add(root.val);
        ans.addAll(inorderTraversal(root.right));
        return ans;
    }
}

3.2 方法二(迭代)

中序遍历是左根右,所以要从树的最左下角开始遍历
分两步,一是压栈,二是取值
向最左子树移动(压栈):若未达最左子树(root存在,可能还有左子树),root入栈等待处理,并移至root左子树**(注意不是判断root左子树是否存在!!!)**;
处理root节点(取值):若已达最左子树(root不存在,无左子树),且stack非空,弹出栈顶节点,记录root值(该root无左子树),再移至root右子树

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> ans = new LinkedList<Integer>();
        if(root == null)    return ans;
        Stack<TreeNode> stack = new Stack<TreeNode>();

        while(root != null  || !stack.empty()){
            // 向最左子树移动(压栈):若未达最左子树,压栈等待处理
            if(root != null){
                stack.push(root);
                root = root.left;
            }
            // 处理root节点(取值):若已达最左子树,但仍有节点需要处理
            else if(!stack.empty()){
                root = stack.pop();
                ans.add(root.val);
                root = root.right;
            }
        }
        return ans;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值