【前言】 二叉树的遍历过程就是根据某一顺序访问树中的节点,树的几种常用遍历方法有:前序遍历、中序遍历以及后序遍历。由于二叉树属于一个无环的图,所以图中的深度优先遍历和广度(广度)优先编历也适用于二叉树。
【1.深度遍历描述】深度遍历是向深度搜索的过程,沿着各分支路径走到尽头,再返回遍历其他的节点。二叉树是无环的结构,在遍历时候只需将各个节点压入栈中,无需标记节点是否已经访问。深度优先遍历路径是根节点------>左子树------>右子树。
【java代码实现】
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> list=new ArrayList<Integer>();
Stack<TreeNode> s=new Stack<TreeNode>();
if(root==null)
return list;
s.push(root);
while(!s.isEmpty()){
TreeNode node=s.peek();
list.add(node.val);
node=s.pop();
System.out.println(node.val);// 1 2 4 3 5
//先压右子树 后压左子树,达到左子树先出栈的效果
if(node.right!=null){
s.push(node.right);
}
if(node.left!=null){
s.push(node.left);
}
}
return list;
}
【入栈出栈示意】
【2.广度度遍历描述】广度遍历是向层次搜索的过程,即按照二叉树的深度递增的顺序一层一层的遍历节点。在遍历时候只需将各个节点压入队列中,广度优先遍历路径是根节点------>第二层深度节点------>......------->最后一层深度节点。根据树的深度以及左右孩子的顺序来输出,所以就是先进先出的原则,那么我们当然就想到了队列这个数据结构。可以在队尾依次插入左右孩子,在队头依次读取并删除左右孩子,这样就保证了层次的输出。
【java代码实现】
public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {
ArrayList<Integer> list=new ArrayList<Integer>();
LinkedList<TreeNode> q=new LinkedList<TreeNode>();
if(root==null)
return new ArrayList<Integer>();
q.add(root);
while(!q.isEmpty()){//层次遍历
list.add(q.peek().val);
TreeNode node=q.removeFirst();//队头node
if(node.left!=null){
q.add(node.left);
}
if(node.right!=null){
q.add(node.right);
}
}
return list;
}
【入队出队示意】
【3.二叉树构建】数组构建成二叉树递归过程
/**
* 采用递归的方式创建一颗二叉树
* 传入的是二叉树的数组表示法
* 构造后是二叉树的二叉链表表示法
*/
public static TreeNode makeBinaryTreeByArray(int[] array,int index){
if(index<array.length){
int value=array[index];
if(value!=0){
TreeNode t=new TreeNode(value);
array[index]=0;
t.left=makeBinaryTreeByArray(array,index*2);
t.right=makeBinaryTreeByArray(array,index*2+1);
return t;
}
}
return null;
}
以上,介绍了二叉树的构建以及深度优先遍历 广度优先遍历过程。