目录
1、二叉树的基础遍历
很多情况下,我们可能需要像遍历数组数组一样,遍历树,从而拿出树中存储的每一个元素,由于树状结构和线性
结构不一样,它没有办法从头开始依次向后遍历,所以存在如何遍历,也就是按照什么样的搜索路径进行遍历的问
题。
我们把树简单的画作上图中的样子,由一个根节点、一个左子树、一个右子树组成,那么按照根节点什么时候被访问,我们可以把二叉树的遍历分为以下三种方式:
1.前序遍历:
先访问根结点,然后再访问左子树,最后访问右子树
2.中序遍历:
先访问左子树,中间访问根节点,最后访问右子树
3.后序遍历:
先访问左子树,再访问右子树,最后访问根节点
如果我们分别对下面的树使用三种遍历方式进行遍历,得到的结果如下:
1.前序遍历:
//获取整个树中所有的键
public Queue<Key> preErgodic(){
Queue<Key> keys = new Queue<>();
preErgodic(root,keys);
return keys;
}
//获取指定树x的所有键,并放到keys队列中
public void preErgodic(Node x,Queue<Key> keys){
if(x == null){
return;
}
keys.enqueue(x.key);
if(x.left != null){
preErgodic(x.left, keys);
}
if(x.right != null){
preErgodic(x.right, keys);
}
}
2.中序遍历:
public Queue<Key> midErgodic(){
Queue<Key> keys = new Queue<>();
midErgodic(root,keys);
return keys;
}
public void midErgodic(Node x,Queue<Key> keys){
if(x == null){
return;
}
if(x.left != null){
midErgodic(x.left,keys);
}
keys.enqueue(x.key);
if(x.right != null){
midErgodic(x.right,keys);
}
}
3.后序遍历:
public Queue<Key> afterErgodic(){
Queue<Key> keys = new Queue<>();
afterErgodic(root,keys);
return keys;
}
public void afterErgodic(Node x,Queue<Key> keys){
if(x == null){
return;
}
if(x.left != null){
afterErgodic(x.left,keys);
}
if(x.right != null){
afterErgodic(x.right,keys);
}
keys.enqueue(x.key);
}
2、二叉树的层序遍历
所谓的层序遍历,就是从根节点(第一层)开始,从上到下,从左到右,获取每一层所有结点的值,有二叉树如下:
那么层序遍历的结果是: EBGADFHC
实现步骤:
1.创建队列,存储每一层的结点;
2.使用循环从队列中弹出一个结点:
2.1获取当前结点的key;
2.2如果当前结点的左子结点不为空,则把左子结点放入到队列中
2.3如果当前结点的右子结点不为空,则把右子结点放入到队列中
public Queue<Key> layerErgodic(){
//定义两个队列,分别存放树中的键和结点
Queue<Key> keys = new Queue<>();
Queue<Node> nodes = new Queue<>();
//默认往队列中存放跟结点
nodes.enqueue(root);
while(!nodes.isEmpty()){
Node n = nodes.dequeue();
if(n == null){
break;
}
keys.enqueue(n.key);
if(n.left != null){
nodes.enqueue(n.left);
}
if(n.right != null){
nodes.enqueue(n.right);
}
}
return keys;
}
二叉树的最大深度问题
1.计算左子树的最大深度;
2.计算右子树的最大深度;
3.当前树的最大深度=左子树的最大深度和右子树的最大深度中的较大者+1
//最大深度
public int MaxDepth(){
return MaxDepth(root);
}
public int MaxDepth(Node x){
if(x == null){
return 0;
}
int max = 0;
int maxL = 0;
int maxR = 0;
if(x.left != null){
maxL = MaxDepth(x.left);
}
if(x.right != null){
maxR = MaxDepth(x.right);
}
max = maxL>maxR?maxL+1:maxR+1;
return max;
}