算法训练 第六周

二、二叉树的中序遍历

算法训练 第六周_第1张图片
本题给我们了一个二叉树,要求我们以中序遍历的方式输出它的值。

1.递归法

使用递归的方式来模拟遍历二叉树的过程,按照左头右的顺序进行,递归终止条件为遇到空节点,具体代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> list = new ArrayList<>();
    public List<Integer> inorderTraversal(TreeNode root) {
        inorderRecur(root);
        return list;
    }
    public void inorderRecur(TreeNode root) {
        if(root == null) {
            return;
        }
        inorderRecur(root.left);
        list.add(root.val);
        inorderRecur(root.right);
    }
}
复杂度分析
  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。

2.迭代法

迭代法其实是递归法的另一种实现方式,我们通过维护一个栈来模拟实现递归的过程,具体代码如下:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        Stack<TreeNode> sta = new Stack<>();
        TreeNode head = root;
        while(!sta.isEmpty() || head != null) {
            if(head != null) {
                sta.push(head);
                head = head.left;
            } else {
                head = sta.pop();
                list.add(head.val);
                head = head.right;
            }
        }
        return list;
    }
}
复杂度分析
  • 时间复杂度:O(n)。
  • 空间复杂度:O(n)。

你可能感兴趣的:(算法)