Leetcode 144. 二叉树的前序遍历

遍历算法可选用递归或者迭代。按照访问根节点——左子树——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。因此整个遍历过程天然具有递归的性质,我们可以直接用递归函数来模拟这一过程。

递归算法较为简单且常用:

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
    	List<Integer> res = new ArrayList<>();
    	inorder(root,res);
    	return res;
    }
    
    public void inorder(TreeNode root,List<Integer> res) {
    	if(root!=null) {
            res.add(root.val);
    		inorder(root.left,res);
    		
    		inorder(root.right,res);
    	}
    	
    }
}

时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。

空间复杂度:O(n),为递归过程中栈的开销,平均情况下为 O(log⁡n),最坏情况下树呈现链状,为 O(n)。

迭代算法:
递归与迭代在本质上是等价的,只不过递归的时候由系统隐式地维护了一个栈,而在迭代时需要把这个栈显示地模拟出来。由于栈先进后出的特点,在前序遍历考虑左右子树时,需要先将右子树入栈,再将左子树入栈。迭代算法的代码如下:

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
    	List<Integer> res = new ArrayList<>();
    	if(root==null) {
    		return res;
    	}
    	
    	//迭代算法中,需要自己维护一个栈用于遍历
    	//前序遍历:中-左-右
    	//但入栈顺:中-右-左
    	Deque<TreeNode> stack = new LinkedList<>();
    	stack.push(root);
    	while(!stack.isEmpty()) {
    		TreeNode node = stack.pop();
    		res.add(node.val);
    		if(node.right!=null) {
    			stack.push(node.right);
    		}
    		if(node.left!=null) {
    			stack.push(node.left);
    		}
    	}
    	
    	return res;
    }
}

时间复杂度:O(n),其中 n 是二叉树的节点数。每一个节点恰好被遍历一次。

空间复杂度:O(n),为迭代过程中显式栈的开销,平均情况下为 O(log⁡n),最坏情况下树呈现链状,为 O(n)。

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