概述
1.前序遍历; (根左右)
先访问根结点,然后再访问左子树,最后访问右子树
2.中序遍历; (左根右) ★★★
先访问左子树,中间访问根节点,最后访问右子树
3.后序遍历; (左右根)
先访问左子树,再访问右子树,最后访问根节点

前序遍历
思路 :使用队列来装键key; 前序遍历顺序为(根左右),所以先将当前结点添加至队列que中,然后再先左后右的顺序递归添加key;
若有if判断子树是否存在则不需要return递归出口,若没有if判断是否存在子树则有递归出口 即当前结点为null。
方法一:
//获取整个树中所有的键key
public Queue<Key> preErgodic(){ //返回一个队列Queue,(尾插头取)
Queue<Key> que=new LinkedList();
preErgodic(root,que);//从root开始获取key
return que;
}
//将当前树的所有key并放到que队列中
private void preErgodic(Node x,Queue<Key> que){
if(x==null){ //此时这里是安全校验,并非递归出口 !
return;
}
//先把当前结点x的key先放入队列que中,即前序遍历(根左右)
que.add(x.key);
//先递归x结点的左子树
if(x.left!=null){
preErgodic(x.left,que);
}
//后递归x结点的右子树
if(x.right!=null){
preErgodic(x.right,que);
}
}
这里if(x==null){ return; } 只是安全校验,只要root不为null,并没有生效。
方法二:
以上亦或者可以改为:
//前序遍历
public Queue<Key> preErgodic(){ //返回一个队列Queue,(尾插头取)
Queue<Key> que=new LinkedList();
preErgodic(root,que);//从root开始获取key
return que;
}
//将当前树的所有key并放到que队列中
private void preErgodic(Node x,Queue<Key> que){
if(x==null){ //当前树为null,递归结束条件 !
return;
}
//先把当前结点x的key先放入队列que中,即前序遍历(根左右)
que.add(x.key);
//先递归x结点的左子树
preErgodic(x.left,que);
//后递归x结点的右子树
preErgodic(x.right,que);
}
即去掉i左右子树的if判断,将if(x==null){ return;作为递归出口!
中序遍历
与前序遍历类似:使用队列来装键key; 中序遍历顺序为(左根右),
若有if判断子树是否存在则不需要return递归出口,(方法一)。
若没有if判断是否存在子树则有递归出口 即当前结点为null。(方法二)
public Queue<Key> midErgodic(){
Queue que=new LinkedList(); //创建队列
midErgodic(root, que);
return que;
}
private void midErgodic(Node x,Queue que) {
if (x == null) {
return; }//安全性校验
if (x.left != null) { //
midErgodic(x.left, que); //递归
}
que.add(x.key);
if (x.right != null) {
midErgodic(x.right, que);
}
}
后续遍历
原理同上(方法二)
//后序遍历
public Queue<Key> afterErgodic(){
Queue<Key> que =new LinkedList<>();
afterErgodic(root,que);
return que;
}
private void afterErgodic(Node x, Queue<Key> que) {
if(x==null){ //递归出口
return ;
}
afterErgodic(x.left,que);
afterErgodic(x.right,que);
que.add(x.key);
}
这篇博客详细介绍了二叉树的三种遍历方法:前序遍历(根左右)、中序遍历(左根右)和后序遍历(左右根)。通过递归实现,分别展示了带if判断和不带if判断的两种实现方式,强调了递归出口的设置。同时,对于每种遍历,都提供了相应的代码实现,帮助读者理解遍历过程。

855

被折叠的 条评论
为什么被折叠?



