二叉树的遍历
总结一下二叉树的三种遍历方式,分别为前序遍历、中序遍历、后序遍历,每种遍历方式用两种方法:递归遍历和迭代遍历
1.首先来分析一下二叉树的前序遍历
前序遍历首先访问根节点,然后遍历左子树,最后遍历右子树。
如图所示:
递归方法如下:
- 1 public List<Integer> preorderTraversal(TreeNode root) {
- 2 List<Integer> list=new ArrayList();
- 3 if(root!=null){
- 4 list.add(root.val);
- 5 list.addAll(preorderTraversal(root.left));
- 6 list.addAll(preorderTraversal(root.right));
- 7 }
- 8 return list;
- 9 }
代码分析:先往集合中插入根节点的值,然后到根的左叶子节点,直到左叶子节点为null,右子节点相同原理,即可前序遍历出二叉树;
迭代方法如下:
- 1 List<Integer> list=new ArrayList();
- 2 if(root==null){
- 3 return list;
- 4 }
- 5 Stack<TreeNode> stack= new Stack();
- 6 stack.push(root);
- 7 while(stack.size()>0){
- 8 TreeNode treeNode=stack.pop();
- 9 list.add(treeNode.val);
- 10 if(treeNode.right!=null){
- 11 stack.push(treeNode.right);
- 12 }
- 13 if(treeNode.left!=null){
- 14 stack.push(treeNode.left);
- 15 }
- 16 }
- 17 return list;
代码分析: 用迭代方法遍历二叉树, 我们需要用到栈来保存节点,通过栈先进后出的特性,我们先把根节点存入栈中,然后步骤如下
(1)当栈中元素数量大于0时
(2)取出最上面的栈元素,将其值放入集合中,查看是否有右叶子节点,有的话放入栈中,查看是否有左叶子节点,有的话放入栈中。
(3)当栈中所有元素均被取出,结束迭代循环,返回集合。
2.二叉树的中序遍历
中序遍历是先遍历左子树,然后访问根节点,然后遍历右子树。
递归方法如下:
- 1 List<Integer> list=new ArrayList();
- 2 if(root!=null){
- 3 list.addAll(inorderTraversal(root.left));
- 4 list.add(root.val);
- 5 list.addAll(inorderTraversal(root.right));
- 6 }
- 7 return list;
迭代方法如下:
- 1 List<Integer> list=new ArrayList();
- 2 Stack<TreeNode> stack= new Stack();
- 3 while(true){
- 4 if(root!=null){
- 5 stack.push(root);
- 6 root=root.left;
- 7 }else{
- 8 if(stack.isEmpty()){
- 9 return list;
- 10 }
- 11 TreeNode treeNode =stack.pop();
- 12 list.add(treeNode.val);
- 13 root=treeNode.right;
- 14 }
- 15 }
代码分析:
1.先将左子树全部压入栈中,然后取出左子树的最后一个节点
2.将弹出的节点的值存入数组中,判断是否有右子树节点,压入栈中,重复1步骤
3.直到弹出所有栈中节点,返回数组
3.二叉树的后序遍历
后序遍历是先遍历左子树,然后遍历右子树,最后访问树的根节点。
递归遍历:
- 1 List<Integer> list=new ArrayList();
- 2 if(root!=null){
- 3 list.addAll(inorderTraversal(root.left));
- 4 list.addAll(inorderTraversal(root.right));
- 5 list.add(root.val);
- 6 }
- 7 return list;
迭代方法如下:
- List<Integer> list=new ArrayList<Integer> ();
- if(root==null){
- return list;
- }
- Stack<TreeNode> stack =new Stack<TreeNode>();
- stack.push(root);
- while(!stack.isEmpty()){
- TreeNode r=stack.pop();
- list.add(0,r.val);
- if(r.left!=null){
- stack.push(r.left);
- }
- if(r.right!=null){
- stack.push(r.right);
- }
- }
- return list;
代码分析:
二叉树后序的迭代遍历方法和二叉树前序的迭代遍历类似,
通过遍历根右左的顺序 将值插入到list的头部位置,相当于进行了 reverse 返回的list变成了左右根 的顺序