博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
三郎数据结构算法学习笔记:二叉树的三种遍历及增删改查
阅读量:1902 次
发布时间:2019-04-26

本文共 6727 字,大约阅读时间需要 22 分钟。

三郎数据结构算法学习笔记:二叉树的三种遍历及增删改查

二叉树遍历的说明

前序遍历: 根左右

中序遍历: 左根右
后序遍历:左右根

遍历图示

在这里插入图片描述

运行结果

在这里插入图片描述

源代码(增删改查自己去掉注释)

package com.atguigu.tree;public class BinaryTreeDemo {	public static void main(String[] args) {		//先需要创建一颗二叉树		BinaryTree binaryTree = new BinaryTree();		//创建需要的结点		HeroNode root = new HeroNode(1, "宋江");		HeroNode node2 = new HeroNode(2, "吴用");		HeroNode node3 = new HeroNode(3, "卢俊义");		HeroNode node4 = new HeroNode(4, "林冲");		HeroNode node5 = new HeroNode(5, "关胜");				//说明,我们先手动创建该二叉树,后面我们学习递归的方式创建二叉树		root.setLeft(node2);		root.setRight(node3);		node3.setRight(node4);		node3.setLeft(node5);		binaryTree.setRoot(root);				//测试//		System.out.println("前序遍历"); // 1,2,3,5,4//		binaryTree.preOrder();				//测试 //		System.out.println("中序遍历");//		binaryTree.infixOrder(); // 2,1,5,3,4//		//		System.out.println("后序遍历");//		binaryTree.postOrder(); // 2,5,4,3,1				//前序遍历		//前序遍历的次数 :4 //		System.out.println("前序遍历方式~~~");//		HeroNode resNode = binaryTree.preOrderSearch(5);//		if (resNode != null) {//			System.out.printf("找到了,信息为 no=%d name=%s", resNode.getNo(), resNode.getName());//		} else {//			System.out.printf("没有找到 no = %d 的英雄", 5);//		}				//中序遍历查找		//中序遍历3次//		System.out.println("中序遍历方式~~~");//		HeroNode resNode = binaryTree.infixOrderSearch(5);//		if (resNode != null) {//			System.out.printf("找到了,信息为 no=%d name=%s", resNode.getNo(), resNode.getName());//		} else {//			System.out.printf("没有找到 no = %d 的英雄", 5);//		}				//后序遍历查找		//后序遍历查找的次数  2次//		System.out.println("后序遍历方式~~~");//		HeroNode resNode = binaryTree.postOrderSearch(5);//		if (resNode != null) {//			System.out.printf("找到了,信息为 no=%d name=%s", resNode.getNo(), resNode.getName());//		} else {//			System.out.printf("没有找到 no = %d 的英雄", 5);//		}				//测试一把删除结点				System.out.println("删除前,前序遍历");		binaryTree.preOrder(); //  1,2,3,5,4		binaryTree.delNode(5);		//binaryTree.delNode(3);		System.out.println("删除后,前序遍历");		binaryTree.preOrder(); // 1,2,3,4							}}//定义BinaryTree 二叉树class BinaryTree {	private HeroNode root;	public void setRoot(HeroNode root) {		this.root = root;	}		//删除结点	public void delNode(int no) {		if(root != null) {			//如果只有一个root结点, 这里立即判断root是不是就是要删除结点			if(root.getNo() == no) {				root = null;			} else {				//递归删除				root.delNode(no);			}		}else{			System.out.println("空树,不能删除~");		}	}	//前序遍历	public void preOrder() {		if(this.root != null) {			this.root.preOrder();		}else {			System.out.println("二叉树为空,无法遍历");		}	}		//中序遍历	public void infixOrder() {		if(this.root != null) {			this.root.infixOrder();		}else {			System.out.println("二叉树为空,无法遍历");		}	}	//后序遍历	public void postOrder() {		if(this.root != null) {			this.root.postOrder();		}else {			System.out.println("二叉树为空,无法遍历");		}	}		//前序遍历	public HeroNode preOrderSearch(int no) {		if(root != null) {			return root.preOrderSearch(no);		} else {			return null;		}	}	//中序遍历	public HeroNode infixOrderSearch(int no) {		if(root != null) {			return root.infixOrderSearch(no);		}else {			return null;		}	}	//后序遍历	public HeroNode postOrderSearch(int no) {		if(root != null) {			return this.root.postOrderSearch(no);		}else {			return null;		}	}}//先创建HeroNode 结点class HeroNode {	private int no;	private String name;	private HeroNode left; //默认null	private HeroNode right; //默认null	public HeroNode(int no, String name) {		this.no = no;		this.name = name;	}	public int getNo() {		return no;	}	public void setNo(int no) {		this.no = no;	}	public String getName() {		return name;	}	public void setName(String name) {		this.name = name;	}	public HeroNode getLeft() {		return left;	}	public void setLeft(HeroNode left) {		this.left = left;	}	public HeroNode getRight() {		return right;	}	public void setRight(HeroNode right) {		this.right = right;	}	@Override	public String toString() {		return "HeroNode [no=" + no + ", name=" + name + "]";	}		//递归删除结点	//1.如果删除的节点是叶子节点,则删除该节点	//2.如果删除的节点是非叶子节点,则删除该子树	public void delNode(int no) {				//思路		/*		 * 	1. 因为我们的二叉树是单向的,所以我们是判断当前结点的子结点是否需要删除结点,而不能去判断当前这个结点是不是需要删除结点.			2. 如果当前结点的左子结点不为空,并且左子结点 就是要删除结点,就将this.left = null; 并且就返回(结束递归删除)			3. 如果当前结点的右子结点不为空,并且右子结点 就是要删除结点,就将this.right= null ;并且就返回(结束递归删除)			4. 如果第2和第3步没有删除结点,那么我们就需要向左子树进行递归删除			5.  如果第4步也没有删除结点,则应当向右子树进行递归删除.		 */		//2. 如果当前结点的左子结点不为空,并且左子结点 就是要删除结点,就将this.left = null; 并且就返回(结束递归删除)		if(this.left != null && this.left.no == no) {			this.left = null;			return;		}		//3.如果当前结点的右子结点不为空,并且右子结点 就是要删除结点,就将this.right= null ;并且就返回(结束递归删除)		if(this.right != null && this.right.no == no) {			this.right = null;			return;		}		//4.我们就需要向左子树进行递归删除		if(this.left != null) {			this.left.delNode(no);		}		//5.则应当向右子树进行递归删除		if(this.right != null) {			this.right.delNode(no);		}	}		//编写前序遍历的方法	public void preOrder() {		System.out.println(this); //先输出父结点		//递归向左子树前序遍历		if(this.left != null) {			this.left.preOrder();		}		//递归向右子树前序遍历		if(this.right != null) {			this.right.preOrder();		}	}	//中序遍历	public void infixOrder() {				//递归向左子树中序遍历		if(this.left != null) {			this.left.infixOrder();		}		//输出父结点		System.out.println(this);		//递归向右子树中序遍历		if(this.right != null) {			this.right.infixOrder();		}	}	//后序遍历	public void postOrder() {		if(this.left != null) {			this.left.postOrder();		}		if(this.right != null) {			this.right.postOrder();		}		System.out.println(this);	}		//前序遍历查找	/**	 * 	 * @param no 查找no	 * @return 如果找到就返回该Node ,如果没有找到返回 null	 */	public HeroNode preOrderSearch(int no) {		System.out.println("进入前序遍历");		//比较当前结点是不是		if(this.no == no) {			return this;		}		//1.则判断当前结点的左子节点是否为空,如果不为空,则递归前序查找		//2.如果左递归前序查找,找到结点,则返回		HeroNode resNode = null;		if(this.left != null) {			resNode = this.left.preOrderSearch(no);		}		if(resNode != null) {//说明我们左子树找到			return resNode;		}		//1.左递归前序查找,找到结点,则返回,否继续判断,		//2.当前的结点的右子节点是否为空,如果不空,则继续向右递归前序查找		if(this.right != null) {			resNode = this.right.preOrderSearch(no);		}		return resNode;	}		//中序遍历查找	public HeroNode infixOrderSearch(int no) {		//判断当前结点的左子节点是否为空,如果不为空,则递归中序查找		HeroNode resNode = null;		if(this.left != null) {			resNode = this.left.infixOrderSearch(no);		}		if(resNode != null) {			return resNode;		}		System.out.println("进入中序查找");		//如果找到,则返回,如果没有找到,就和当前结点比较,如果是则返回当前结点		if(this.no == no) {			return this;		}		//否则继续进行右递归的中序查找		if(this.right != null) {			resNode = this.right.infixOrderSearch(no);		}		return resNode;			}		//后序遍历查找	public HeroNode postOrderSearch(int no) {				//判断当前结点的左子节点是否为空,如果不为空,则递归后序查找		HeroNode resNode = null;		if(this.left != null) {			resNode = this.left.postOrderSearch(no);		}		if(resNode != null) {//说明在左子树找到			return resNode;		}				//如果左子树没有找到,则向右子树递归进行后序遍历查找		if(this.right != null) {			resNode = this.right.postOrderSearch(no);		}		if(resNode != null) {			return resNode;		}		System.out.println("进入后序查找");		//如果左右子树都没有找到,就比较当前结点是不是		if(this.no == no) {			return this;		}		return resNode;	}	}//

转载地址:http://xlwcf.baihongyu.com/

你可能感兴趣的文章
C++ 在栈上分配内存
查看>>
C/C++之回调函数与函数指针和类成员函数指针
查看>>
boost::shared_array
查看>>
浅谈C++中指针和引用的区别
查看>>
C++学习笔记
查看>>
XlFileFormat 枚举 (Excel)
查看>>
运行一个dos命令,并返回执行结果
查看>>
经典SQL语句大全
查看>>
windows 批处理脚本编写
查看>>
python爬虫实战
查看>>
C++:属性封装
查看>>
C++:属性封装
查看>>
Objective-c:属性
查看>>
C++入门学习:了解封装,类与结构体
查看>>
C++三大特性之一:封装
查看>>
C++属性封装代码
查看>>
属性封装以及继承
查看>>
C语言实现封装、继承和多态
查看>>
C/C++(C++封装)
查看>>
for循环中的switch的break和continue作用范围
查看>>