题目
Given a binary tree, return the inorder traversal of its nodes’ values.
给定一个二叉树,返回其中序遍历序列。
示例
思路
中序遍历(LDR)是二叉树遍历的一种,也叫做中根遍历、中序周游。在二叉树中,中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。
首先考虑递归实现:
从根结点开始遍历:
如果其左子结点不为空,对左子结点进行遍历;
遍历结束后将该结点加到队列中;
如果其右子结点不为空,对右子结点进行遍历。
其次考虑迭代实现:
从根结点开始,依次往下查找左子结点,并存储在stack中。
然后每次从stack中取出一个结点,处理方式(值存储在list中,然后访问右子结点),如果右子结点为空,则继续从栈中取出结点进行同样的处理(先依照第一步依次访问其左子结点到底,再采用第二步的处理方式)。
题解
题解1
递归实现
/**
* 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> list = new ArrayList<>();
ldr(root,list);
return list;
}
public void ldr(TreeNode node, List<Integer> list){
if(node==null)
return;
if(node.left!=null){
ldr(node.left,list);
}
list.add(node.val);
if(node.right!=null){
ldr(node.right,list);
}
}
}
题解2
迭代实现:
/**
* 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> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode curr = root;
while(curr!=null||!stack.isEmpty()){
while(curr!=null){
stack.push(curr);
curr = curr.left;
}
curr = stack.pop();
list.add(curr.val);
curr = curr.right;
}
return list;
}
}
反思
复杂度分析
递归:
时间复杂度:O(n)
空间复杂度:
最差情形下:O(n)
平均情形下:O(log n)
迭代:
时间复杂度:O(n)
空间复杂度:O(n)
思路反思
无论是上道题【Leetcode 617】Merge Two Binary Trees -EASY还是这道题,都使用了stack存储结点的方式对二叉树进行迭代遍历。但是最初思路没有很清晰,应该多加反思总结,拓宽思路。
扩展
线索二叉树(Thread Binary Tree)
思路:
如果当前结点存在左子结点:
- 则找到该左子树的最右子结点,并将最右子结点的右指针指向当前结点,然后令当前结点的左指针指向null值,并将curr指针指向该左子结点。
如果当前结点不存在左子结点:
- 则将该结点添加到res数组中,并将curr指针指向当前结点的右子结点。
重复循环,直至当前结点为null。
代码如下:
/**
* 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> res = new ArrayList<>();
TreeNode curr = root;
TreeNode pre,temp;
while(curr!=null){
if(curr.left==null){
res.add(curr.val);
curr = curr.right;
}
else{
pre = curr.left;
while(pre.right!=null){
pre = pre.right;
}
pre.right = curr;
temp = curr;
curr = curr.left;
temp.left = null;
}
}
return res;
}
}