二叉树的前序,中序,后续,层次遍历,以及查找和删除

本文详细介绍了二叉树的前序、中序、后序及层次遍历方法,探讨了二叉树的查找与删除操作实现。通过具体代码示例,深入解析了二叉树节点的创建与管理。

import java.util.LinkedList;

public class TreeNode {
//权值
int value;
//左节点
TreeNode leftnode;
//右节点
TreeNode rightnode;
//节点左边右边类型,0默认的,是左右子树,1代表是左右指针
int leftType;
int rightType;

public TreeNode(int value){
	this.value = value;
}
public int getValue() {
	return value;
}
public void setValue(int value) {
	this.value = value;
}

public void setRightnode(TreeNode rightnode) {
	this.rightnode = rightnode;
}
public void setLeftnode(TreeNode leftnode) {
	this.leftnode = leftnode;
}

1.前序遍历

public void frontshow() {
	//先遍历当前节点
	System.out.println(value);
	//再左节点,在左节点进行递归
	if(leftnode!=null){
		leftnode.frontshow();
	}
	if(rightnode!=null){
		rightnode.frontshow();
	}
	
}

2.中序遍历

public void middleshow() {
	if(leftnode!=null){
		leftnode.middleshow();
	}
	System.out.println(value);
	if(rightnode!=null){
		rightnode.middleshow();
	}
	
}

2.后序遍历

public void lastshow() {
	if(leftnode!=null){
		leftnode.lastshow();
	}
	if(rightnode!=null){
		rightnode.lastshow();
	}
	System.out.println(value);
	
}

3.层次遍历

public void Leveltraversal(TreeNode root){
	/*
	对于不为空的结点,先把该结点加入到队列中,从队中拿出结点,如果该结点的左右结点不为空,就分别把左右结点加入到队列中
                重复以上操作直到队列为空
    */
	if(root==null){
		return;
	}
	LinkedList<TreeNode> list = new LinkedList<>();
	list.add(root);
	//定义一个当前节点,
	TreeNode currentnode = null;
	//如果队列 不为空,循环
	while(!list.isEmpty()){
		//将移除并返回队列的头部元素赋给当前节点
		currentnode = list.poll();
		//输出当前节点
		System.out.println(currentnode.value);
		if(currentnode.leftnode!=null){
			list.add(currentnode.leftnode);
		}
		if(currentnode.rightnode!=null){
			list.add(currentnode.rightnode);
		}
	}
	System.out.println();
    System.out.println("该树的最后一个节点"+currentnode.value);	
}

4.前序查找

public TreeNode treesearch(int i) {
    TreeNode target = null;
	if(this.value==i){
    	return this;
    }else{
    	//找左子树,并用一个变量接收结果
    	if(leftnode!=null){
    		target = leftnode.treesearch(i);
    	}
    	//如果在左子树中找到了,那么target不为空,返回接收到的值
    	if(target!=null){
    		return target;
    	}
    	if(rightnode!=null){
    		target = rightnode.treesearch(i);
    	}
    }
	return target;
}

5…删除

public void delete(int i) {
   //将根节点定义为父节点
	TreeNode parent = this;
	//判断删除的数是否在根节点的左子树和右子树上
	if(leftnode!=null&&leftnode.value==i){
		leftnode = null;
		//return;
	}
	if(parent.rightnode!=null&&parent.rightnode.value==i){
		parent.rightnode = null;
		//return;
	}
	//将从子树开始找的时候,将根节点的左子树或右子树看作父节点
	parent = leftnode;
	//从左子树的子节点和右子树的子节点开始找,采用递归
	if(parent!=null){
		parent.delete(i);
	}
	
	parent = rightnode;
	if(parent!=null){
		parent.delete(i);
	}
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值