二叉树的中序遍历,将每个节点中值保存在集合中,并返回,递归和递归两种方法:
方法一:利用二叉树的中序遍历,代码如下:
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ls=new ArrayList();
inorderVisit(root,ls);
return ls;
}
public void inorderVisit(TreeNode root, List<Integer> ls){
if(root==null) return ;
inorderVisit(root.left,ls);
ls.add(root.val);
inorderVisit(root.right,ls);
}
}
方法二:非递归调用时,利用了Java中的栈集合,比较简单。分析一下,首先遍历头节点,为空,直接返回;若不为空,则将头节点入栈,栈不为空,将访问节点,如果节点的左孩子不为空,那么继续将它的左孩子栈,将此节点的左孩子设置为空(它的左孩子已经入过栈了);如果左孩子为空,则节点出栈,存储到集合中,看他的右孩是否为空,不为空,则将右孩子入栈;子代码如下:
public class Solution {
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> ls=new ArrayList();
if(root ==null) return ls;
Stack<TreeNode> stack=new Stack();
stack.push(root);
while(!stack.empty()){
TreeNode n=stack.peek();
if(n.left!=null){
stack.push(n.left);
n.left=null;
}else{
ls.add(n.val);
stack.pop();
if(n.right!=null){
stack.push(n.right);
}
}
}
return ls;
}
}
方法三、这个也是递归调用,可能比上面的更加容易理解一点。分析:首先将最左孩子入栈,再看栈是否为空,不空,访问节点。判断节点的右孩子是否为空,不空,再将此节点的额最左孩子入栈,循环。代码如下:
public List<Integer>inorderTraversal(TreeNode root) {
List<Integer> ls=new ArrayList();
if(root ==null) return ls;
Stack<TreeNode> stack=new Stack();
TreeNode p=root;
while(p!=null){
stack.push(p);
p=p.left;
}
while(!stack.isEmpty()){
TreeNode t=stack.pop();
ls.add(t.val);
if(t.right!=null){
t=t.right;
while(t!=null){
stack.push(t);
t=t.left;
}
}
}
return ls;
}