二叉树的前中后序排序和查找

二叉树

分为
完全二叉树:最后一层的叶子节点从左往右连续,倒数第二层叶子节点从左往右连续
在这里插入图片描述

满二叉树:叶子完整的树,节点数为2^n-1,(n为层数)
在这里插入图片描述

平衡二叉树:又叫平衡搜索二叉树,节点的高度差不会超过1,子节点也可以看作是二叉树
在这里插入图片描述

二叉树代码实现前中后排序

在这里插入图片描述

二叉树 代码
package com.how2java.tmallweb_springboot.test;

/**
 * 二叉树实现前中后排序
 */
public class Tree {

    //根节点
   HeroNode root;
   public Tree(HeroNode root){
       this.root = root;
   }

   //前序遍历(中间节点最先遍历)
    public void firstOrder(HeroNode node){
       //首先输出中间节点
        System.out.println(node.name);
       //递归输出左边节点的(递归就是将左边节点一次性前序遍历结束)
       if(node.left != null){
           firstOrder(node.left);
       }
       //从左边节点尾部又开始右边子节点的输出
        if(node.right != null){
           firstOrder(node.right);
        }
    }

   //中序遍历
   public void midOrder(HeroNode node){
        //一直走到最底层的左叶子
        if(node.left != null){
            midOrder(node.left);
        }
        //中间节点
       System.out.println(node.name);
       //再是右子树
       if(node.right != null){
           midOrder(node.right);
       }
   }

   //后序遍历(中间节点放在最后遍历)
    public void lastOrder(HeroNode node){
       if(node.left != null){
           lastOrder(node.left);
       }
       if(node.right != null){
           lastOrder(node.right);
       }
        System.out.println(node.name);
    }

}

/**
 * 节点类
 */
class HeroNode{
    int age;//年龄
    String name;//名字
    HeroNode left;//左子节点
    HeroNode right;//右子节点
    public HeroNode(String name,int age){
        this.age = age;
        this.name = name;
    }
}

测试代码
    public static void main(String[] args) {
        HeroNode hero1 = new HeroNode("1",21);
        HeroNode hero2 = new HeroNode("2",20);
        HeroNode hero3 = new HeroNode("3",22);
        HeroNode hero4 = new HeroNode("4",23);
        HeroNode hero5 = new HeroNode("5",24);
        hero1.left = hero2;
        hero1.right = hero3;
        hero2.left = hero4;
        hero2.right = hero5;
        Tree tree = new Tree(hero1);
        //前序遍历
        tree.firstOrder(tree.root);//1 2 4 5 3
        System.out.println("**********");

        //中序遍历
        tree.midOrder(tree.root);
        System.out.println("**********");//4 2 5 1 3
        
        //后续遍历
        tree.lastOrder(tree.root);//4 5 2 3 1
    }

二叉树的前中后序查找

重点回溯
递归结束之后需要用一个HeroNode来保存下一次遍历的结果,并满足条件时返回来。
就是下面这两行代码:
HeroNode resHero = null;
resHero = this.right.findLastOrder(no);
resHero = this.left.findFirstOrder(no);

步骤:
在这里插入图片描述

class HeroNode{
	private int no;
	private String name;
	private HeroNode left;
	private HeroNode right;
	
	//前序遍历
	public void firstOrder(){
		System.out.println(this);//输出中间的节点
		//向左递归
		if(this.left != null){//输出左节点
			this.left.firstOrder();
		}
	    //向右递归
		if(this.right != null){//输出右节点
			this.right.firstOrder();
		}
	}
	//中序遍历
	public void midOrder(){
		//向左递归
		if(this.left != null){
			this.left.midOrder();
		}
		System.out.println(this);//输出中间的节点
	    //向右递归
		if(this.right != null){
			this.right.midOrder();
		}
	}
	//后序遍历
	public void lastOrder(){
		//向左递归
		if(this.left != null){
			this.left.lastOrder();
		}
		//向右递归
		if(this.right != null){
			this.right.lastOrder();
		}
		System.out.println(this);//输出中间的节点
	}
	
	//前序查找
	public HeroNode findFirstOrder(int no){
		if(this.no == no){//查看中间的是否为要找的
			return this;
		}
		HeroNode resHero = null;
		if(this.left != null){//查看左边是否为要找的(左边为空时跳过)
			resHero = this.left.findFirstOrder(no);
		}
		if(resHero != null){//这里是一旦找到就会沿着回溯将找到的返回到最开始的递归
			return resHero;//如果左边的是要找的,就不会是null,就要返回
		}
		if(this.right != null){//查找右边那个是不是要找的(左边查找完开始右边查找)
			resHero = this.right.findFirstOrder(no);
		}
		return resHero;
	}
	//中序查找
	public HeroNode findMidOrder(int no){
		HeroNode resHero = null;
		if(this.left != null){//从左边的节点开始
			resHero = this.left.findMidOrder(no);//这个是为了一路递归使用
		}
		if(resHero != null){//如果左边找到了就直接沿着回溯一路将值返回回去
			return resHero;
		}
		if(this.no == no){//查看当前中间节点是否为要找的节点
			return this;
		}
		if(this.right != null){//如果左边节点没有,就会从最左边最下面的节点开始从右节点开始遍历
			resHero = this.right.findMidOrder(no);
		}
		return resHero;//这里也是给右节点回溯用
	}
	//后序查找
	public HeroNode findLastOrder(int no){
		HeroNode resHero = null;
		if(this.left != null){//将节点跳转到最左边
			resHero = this.left.findLastOrder(no);
		}
		if(resHero != null){
			return resHero;//左节点的回溯
		}
		if(this.right != null){//将节点跳到此节点的最右边节点
			resHero = this.right.findLastOrder(no);
		}
		if(resHero != null){
			return resHero;//右节点的回溯
		}
		if(this.no == no){
			return this;
		}
		return resHero;//回溯(在整个都没有找到的情况下)
	}
}

猜你喜欢

转载自blog.csdn.net/qq_44771337/article/details/108524722