二叉树基本操作—Java实现

本文详细介绍了如何使用Java编程语言实现二叉树的基本操作,包括插入节点、删除节点、遍历等核心功能,旨在帮助读者深入理解二叉树的数据结构及其在实际编程中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package muyanmoyang.data.BTree;

/**
 * 二叉树的节点
 * @author hadoop
 *
 */
class BtNode {
	String data ;
	BtNode lchild ;
	BtNode rchild ;
	public BtNode(String data, BtNode lchild, BtNode rchild) {
		super();
		this.data = data;
		this.lchild = lchild;
		this.rchild = rchild;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
	public BtNode getLchild() {
		return lchild;
	}
	public void setLchild(BtNode lchild) {
		this.lchild = lchild;
	}
	public BtNode getRchild() {
		return rchild;
	}
	public void setRchild(BtNode rchild) {
		this.rchild = rchild;
	}
}
<pre name="code" class="java">package muyanmoyang.data.BTree;

import java.awt.List;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Stack;

public class BTree {
	static BtNode root = initTree() ; 
	public static void main(String[] args) {
		//初始化
		BtNode bt = initTree() ;
		//先序遍历二叉树
		System.out.print("\n先序遍历:");
		preOrder(bt) ;                  // 先序遍历
		System.out.print("\n先序遍历(非递归):");
		preOrderWithoutRecursion(bt) ;  // 先序遍历(非递归)
		System.out.print("\n中序遍历:");
		inOrderWithoutRecursion(bt);    // 中序遍历
		System.out.print("\n后序遍历:");
		postOrder(bt) ;					// 后序遍历
		System.out.print("\n层次遍历:");
		levelOrder(bt) ;                // 层次遍历
		System.out.print("\n二叉树的深度:" + getDepthOfBTree(bt)); 
		System.out.print("\n二叉树的节点个数:" + getNumOfNodes(bt));

		// 求指定节点的parent节点
		System.out.print("\n查询双亲节点,请输入以下节点中的一个: ");
		levelOrder(bt) ;
		System.out.println();
		try{
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
			String str = br.readLine() ;
			BtNode parent = parent(str);
			System.out.println("所求双亲为:" + parent.data);
		}catch(NullPointerException e){
			System.out.println("没有这个节点");
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace(); 
		}
		
		// 查找指定的节点
		BtNode findNode = findNode(bt,"G") ;
		BtNode parent2 = parent(findNode.data);
		System.out.println("所求双亲为:" + parent2.data);
	}
	/*
	 * 初始化树
	 */
	private static BtNode initTree(){
		BtNode aBtNode = new BtNode("A", null, null);
		BtNode bBtNode = new BtNode("B", null, null);
		BtNode cBtNode = new BtNode("C", null, null);
		BtNode dBtNode = new BtNode("D", null, null);
		BtNode eBtNode = new BtNode("E", null, null);
		BtNode fBtNode = new BtNode("F", null, null);
		BtNode gBtNode = new BtNode("G", null, null);
		BtNode hBtNode = new BtNode("H", null, null);
		
		aBtNode.setLchild(bBtNode);
		aBtNode.setRchild(cBtNode);
		bBtNode.setLchild(dBtNode);
		bBtNode.setRchild(eBtNode);
		cBtNode.setLchild(fBtNode);
		cBtNode.setRchild(gBtNode);
		fBtNode.setRchild(hBtNode); 
		return  aBtNode ;
	}
	/*
	 *  先序遍历
	 */
	private static void preOrder(BtNode bt){
		if(bt == null){
			return ; 
		}else{
			System.out.print(bt.data + "、") ;
			if(bt.lchild != null){
				preOrder(bt.lchild) ;
			}
			if(bt.rchild != null){
				preOrder(bt.rchild) ;
			}
		}
	}
	
	/*
	 *  先序遍历 (非递归)
	 */
	private static void preOrderWithoutRecursion(BtNode bt){
		if(bt == null){
			return ;
		}
		Stack<BtNode> stack = new Stack<BtNode>() ;
		BtNode p = bt ;
		while(p!=null || !stack.isEmpty()){
			if(p!=null){
				System.out.print(p.data + "、");
				stack.push(p) ;
				p = p.lchild ;
			}else{
				p = stack.pop() ;
				p = p.rchild ;
			}
		}
	}
	/*
	 *  中序遍历 (非递归实现)
	 */
	private static void inOrderWithoutRecursion(BtNode bt){
		if(bt == null){
			return ;
		}
		Stack<BtNode> stack = new Stack<BtNode>() ;
		BtNode p = bt ;
		while(p!=null || !stack.isEmpty()){
			if(p != null){
				stack.push(p) ;
				p = p.lchild ;
			}else
			{
				p = stack.pop() ;
				System.out.print(p.data + "、");
				p = p.rchild ;
			}
		}
	}
	/*
	 *  后序遍历 (双栈实现)
	 */
	private static void postOrder(BtNode bt){
		if(bt == null){
			return ;
		}
		Stack<BtNode> stack = new Stack<BtNode>() ;
		Stack<BtNode> out = new Stack<BtNode>() ;
		BtNode p = bt ;
		while(p!=null || !stack.isEmpty()){
			if(p != null){
				stack.push(p); 
				out.push(p);
				p = p.rchild ;
			}else{
				p = stack.pop().lchild ;
			}
		}
		while (!out.isEmpty()) {
			p = out.pop() ;
			System.out.print(p.data + "、");	
		}
	}
	
	/*
	 * 层次遍历
	 */
	private static void levelOrder(BtNode bt){
		if(bt == null){
			return ;
		}
		LinkedList queue = new LinkedList() ;
		queue.add(bt) ;
		while(!queue.isEmpty()){
			BtNode tmpNode = (BtNode) queue.remove(0) ;
			System.out.print(tmpNode.data + "、");
			if(tmpNode.lchild != null){
				queue.add(tmpNode.lchild) ;
			}
			if(tmpNode.rchild != null){
				queue.add(tmpNode.rchild);
			}
		}
	}
	
	/*
	 * 求二叉树的深度(递归实现)
	 */
	private static int getDepthOfBTree(BtNode bt){
		if(bt == null){
			return 0 ;
		}
		int a , b ;
		a = getDepthOfBTree(bt.lchild) ;
		b = getDepthOfBTree(bt.rchild) ;
		return (a > b ? a : b) + 1 ;
	}
	
	/*
	 *  求二叉树的节点个数(递归实现)
	 */
	private static int getNumOfNodes(BtNode bt){
		if(bt == null){
			return 0 ;
		}
		return getNumOfNodes(bt.lchild) + getNumOfNodes(bt.rchild) + 1 ;
	}
	
	/*
	 *  求双亲节点
	 */
	private static BtNode parent(String elem){
		return (root==null || root.data.equals(elem))? null : parent(root,elem) ;
	}
	private static BtNode parent(BtNode subTree, String elem) {
		if(subTree == null){
			return null ;
		}
		if((subTree.lchild!=null && subTree.lchild.data.equals(elem)) || (subTree.rchild!= null && subTree.rchild.data.equals(elem))){
			return subTree ;
		}
		BtNode p ;
		if((p=parent(subTree.lchild, elem))!=null){
			return p ;
		}else
			return parent(subTree.rchild, elem) ;
	}
	/*
	 * 在释放某个结点时,该结点的左右子树都已经释放,  所以应该采用后续遍历,当访问某个结点时将该结点的存储空间释放
	 */
	private static void removeSubTree(BtNode subTree){
		if(subTree != null){
			removeSubTree(subTree.lchild);
			removeSubTree(subTree.rchild); 
			subTree = null ;
		}
	}
	
	/*
	 *  查找指定节点,输入节点的data,返回节点的BtNode对象
	 */
	private static BtNode findNode(BtNode bt,String findData){
		BtNode findResultNode = null ;
		if(bt == null){
			return null ;
		}
		if(bt.data.equals(findData)){
			return bt ;
		}
		if(bt.lchild != null){
			findResultNode = findNode(bt.lchild, findData) ;
			if(findResultNode!=null) 
				return findResultNode ;
		}
		if(bt.rchild != null){
			findResultNode = findNode(bt.rchild, findData) ;
			if(findResultNode!=null) 
				return findResultNode ;
		}
		return null ;
	}
}


 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值