数据结构---二叉树的构建及遍历

1、二叉树的构建及遍历

二叉树的遍历:

  • 前序遍历
  • 中序遍历
  • 后续遍历
  • 层次遍历

Node

package com.bennett.test0930;

import java.util.LinkedList;

/**
 * @version:1.0
 * @Description:二叉树结点类
 * @author bennett
 * @date: 2021年10月5日 下午10:50:44
 */ 
public class Node {
	Integer value;
	private Node leftNode;// 左结点
	private Node rightNode;// 右结点

//	构造方法	
	public Node(Integer value) {
		super();
		this.value = value;
	}

//	set方法(设置左右结点)
	public void setLeftNode(Node leftNode) {
		this.leftNode = leftNode;
	}

	public void setRightNode(Node rightNode) {
		this.rightNode = rightNode;
	}

//  前序遍历
	public void frontShow() {
		// 先遍历根节点
		System.out.print(value + " ");
		// 左节点
		if (leftNode != null) {
			leftNode.frontShow();
		}
		// 右节点
		if (rightNode != null) {
			rightNode.frontShow();
		}
	}

	// 中序遍历
	public void midShow() {
		if (leftNode != null) {
			leftNode.midShow();
		}
		System.out.print(value + " ");
		if (rightNode != null) {
			rightNode.midShow();
		}
	}

	// 后序遍历
	public void afterShow() {
		if (leftNode != null) {
			leftNode.afterShow();
		}
		if (rightNode != null) {
			rightNode.afterShow();
		}
		System.out.print(value + " ");
	}

//	层次遍历
	public void levelShow(Node node) {
		LinkedList<Node> list = new LinkedList<Node>();
		list.add(node);
		Node currentNode;

		while (!list.isEmpty()) {
			currentNode = list.poll(); // 获取并移除此列表的头
			System.out.print(currentNode.value+" ");
			if (null != currentNode.leftNode) {
				list.add(currentNode.leftNode);
			}
			if (null != currentNode.rightNode) {
				list.add(currentNode.rightNode);
			}
		}
	}

//	查询结点
	public Node search(int i) {
		Node target = null;
		if (this.value == i) {
			return this;
		} else {
			if (leftNode != null) {
				target = leftNode.search(i);
			}
			if (target != null) {
				return target;
			}
			if (rightNode != null) {
				target = rightNode.search(i);
			}
		}
		return target;
	}

//	删除结点
	public void delete(int i) {
		Node parent = this;
		if (parent.leftNode != null && parent.leftNode.value == i) {
			parent.leftNode = null;
		}
		if (parent.rightNode != null && parent.rightNode.value == i) {
			parent.rightNode = null;
		}
		parent = leftNode;
		if (parent != null) {
			parent.delete(i);
		}
		parent = rightNode;
		if (parent != null) {
			parent.delete(i);
		}
	}
	@Override
	public String toString() {
		return this.value + " ";
	}
}

BinaryTree

package com.bennett.test0930;

/**
 * @version:1.0
 * @Description:二叉树
 * @author bennett
 * @date: 2021年10月5日 下午10:51:07
 */ 
public class BinaryTree {
	private Node rootNode;
//	设置根结点
	public void setRootNode(Node rootNode) {
		this.rootNode = rootNode;
	}
//	获得根结点
	public Node getRootNode() {
		return rootNode;
	}
//	前序遍历
	public void frontShow() {
		if (rootNode != null) {
			rootNode.frontShow();
		}
	}
//	中序遍历
	public void midShow() {
		if (rootNode != null) {
			rootNode.midShow();
		}
	}
//	后序遍历
	public void afterShow() {
		if (rootNode != null) {
			rootNode.afterShow();
		}
	}
//	层次遍历
	public void levelShow() {
		if (rootNode != null) {
			rootNode.levelShow(rootNode);
		}
	}
//	查询结点
	public Node search(int i) {
		return rootNode.search(i);
	}
//	删除结点
	public void delete(int i) {
		if (rootNode.value == i) {
			rootNode = null;
		} else {
			rootNode.delete(i);
		}
	}
}
package com.bennett.test0930;

/**
 * @version:1.0
 * @Description:二叉树测试类
 * @author bennett
 * @date: 2021年10月5日 下午10:51:20
 */ 
public class BinaryTreeTest {
	public static void main(String[] args) {
		// 创建一棵树(空树,没有结点)
		BinaryTree binaryTree = new BinaryTree();
		// 创建一个根节点
		Node root = new Node(1);
		// 把根节点赋值给树
		binaryTree.setRootNode(root);
		// 创建左节点
		Node lNode = new Node(2);
		// 将新创建的结点设置为根节点的左结点
		root.setLeftNode(lNode);
		// 创建右节点
		Node rNode = new Node(3);
		// 将新创建的结点设置为根节点的右结点
		root.setRightNode(rNode);
		// 为2创建两个结点
		lNode.setLeftNode(new Node(4));
		lNode.setRightNode(new Node(5));
		// 为3创建两个结点
		rNode.setLeftNode(new Node(6));
		rNode.setRightNode(new Node(7));

		// 前序遍历
		System.out.println("前序遍历: ");
		binaryTree.frontShow();
		System.out.println();
		// 中序遍历
		System.out.println("中序遍历:");
		binaryTree.midShow();
		System.out.println();
		// 后序遍历
		System.out.println("后序遍历:");
		binaryTree.afterShow();
		System.out.println();

		//层次遍历
		System.out.println("层次遍历:");
		binaryTree.levelShow();
	    System.out.println("");
	    
		// 查找元素
		System.out.println("查找元素:");
		Node result = binaryTree.search(5);
		System.out.println(result);
		// 删除结点
		System.out.println("删除元素3");
		binaryTree.delete(3);
		binaryTree.frontShow();
	}
}

2、二叉树的构建及遍历

BinTree<T>

package com.bennett.test1006;

public class BinTree<T> {
	private Node<T> root;
//	结点类
	static class Node<T>{
		private T value;
//		父节点
		private Node<T> parent;
//		左子树
		private Node<T> leftChild;
//		右子树
		private Node<T> rightChild;
		
		public Node(T value) {
			this.value = value;
		}
		public T getValue() {
			return value;
		}
		public void setValue(T value) {
			this.value = value;
		}
	}
//	初始化
	boolean initial(T value) {
		if(root!=null) return false;
		root=new Node<>(value);
		return true;
	}
//	添加左子树
	boolean addLeft(Node<T> parent,Node<T> node) {
		if(parent==null) return false;
		parent.leftChild=node;
		return true;
	}
//	添加右子树
	boolean addRight(Node<T> parent,Node<T> node) {
		if(parent==null) return false;
		parent.rightChild=node;
		return true;
	}
	
	void itertor(Node<T> root,int level) {
//		前序遍历
		StringBuilder prefix=new StringBuilder();
		for (int i = 0; i < level; i++) {
			prefix.append("--");
		}
		prefix.append(" ");
		System.out.println(prefix.toString()+root.getValue());//根节点
//		System.out.println("-- "+root.leftChild.value);//左子树
		if(root.leftChild!=null) {
			itertor(root.leftChild,level+1);
		}
		
//		中序遍历
//		StringBuilder prefix=new StringBuilder();
//		for (int i = 0; i < level; i++) {
//			prefix.append("--");
//		}
//		prefix.append(" ");
//		System.out.println(prefix.toString()+root.getValue());//根节点
		
		if(root.rightChild!=null) {
			itertor(root.rightChild,level+1);
		}
//		System.out.println("-- "+root.rightChild.value);
		
//		后续遍历
//		StringBuilder prefix=new StringBuilder();
//		for (int i = 0; i < level; i++) {
//			prefix.append("--");
//		}
//		prefix.append(" ");
//		System.out.println(prefix.toString()+root.getValue());//根节点
	}
	
	public Node<T> getRoot() {
		return root;
	}

	public void setRoot(Node<T> root) {
		this.root = root;
	}

	public static void main(String[] args) {
//		创建树
		BinTree<Integer> tree=new BinTree<>();
		tree.initial(1);
//		构建树的结点
		Node<Integer> node1 =new Node<>(-1);
		tree.addLeft(tree.getRoot(),node1);
		Node<Integer> node2 =new Node<>(2);
		tree.addRight(tree.getRoot(),node2);
		Node<Integer> node11 =new Node<>(-11);
		tree.addLeft(node1,node11);
		Node<Integer> node12 =new Node<>(-2);
		tree.addRight(node1,node12);
//		打印树(前中后序遍历根据输出根节点的位置)		
		tree.itertor(tree.getRoot(),0);
	}
} 

练习题

用树结构存储如图所示的信息,图有点模糊,但关键是其结构,信息下面代码中有。
在这里插入图片描述

方式一

package com.bennett.test0930;

import java.util.LinkedList;

/**
 * @version:
 * @Description:结构树的结点
 * @author bennett
 * @date: 2021年10月5日 下午10:52:10
 */ 
public class StringNode {
	private String value;
	private StringNode node1;
	private StringNode node2;
	private StringNode node3;
	private StringNode node4;
	
	public StringNode(String value) {
		super();
		this.value = value;
	}

	public void setNode1(StringNode node1) {
		this.node1 = node1;
	}

	public void setNode2(StringNode node2) {
		this.node2 = node2;
	}

	public void setNode3(StringNode node3) {
		this.node3 = node3;
	}

	public void setNode4(StringNode node4) {
		this.node4 = node4;
	}
	
//	层次遍历
	public void levelShow(StringNode node) {
		LinkedList<StringNode> list = new LinkedList<StringNode>();
		list.add(node);
		StringNode currentNode;

		while (!list.isEmpty()) {
			currentNode = list.poll(); // 获取并移除此列表的头
			System.out.println(currentNode.value+" ");
			if (null != currentNode.node1) {
				list.add(currentNode.node1);
			}
			if (null != currentNode.node2) {
				list.add(currentNode.node2);
			}
			if (null != currentNode.node3) {
				list.add(currentNode.node3);
			}
			if (null != currentNode.node4) {
				list.add(currentNode.node4);
			}
		}
	}
}

package com.bennett.test0930;

/**
 * @version:
 * @Description:结构树
 * @author bennett
 * @date: 2021年10月5日 下午10:51:40
 */ 
public class StringTree {
	private StringNode rootNode;

	public StringNode getRootNode() {
		return rootNode;
	}

	public void setRootNode(StringNode rootNode) {
		this.rootNode = rootNode;
	}
	
//	层次遍历
	public void levelShow() {
		if (rootNode != null) {
			rootNode.levelShow(rootNode);
		}
	}
}
package com.bennett.test0930;

/**
 * @version:
 * @Description:结构树的测试类
 * @author bennett
 * @date: 2021年10月5日 下午10:52:29
 */ 
public class StringTreeTest {
	public static void main(String[] args) {
		StringTree stringTree = new StringTree();
		
//		创建结点
//		前三层
		StringNode rootNode = new StringNode("股东大会");
		stringTree.setRootNode(rootNode);
		StringNode level_2_node1 = new StringNode("董事会");
		rootNode.setNode1(level_2_node1);
		StringNode level_3_node1 = new StringNode("CEO(总经理)");
		level_2_node1.setNode1(level_3_node1);
//		第四层
		StringNode level_4_node1 = new StringNode("副总经理1");
		level_3_node1.setNode1(level_4_node1);
		StringNode level_4_node2 = new StringNode("副总经理2");
		level_3_node1.setNode2(level_4_node2);
		StringNode level_4_node3 = new StringNode("副总经理3");
		level_3_node1.setNode3(level_4_node3);
//		第五层
		StringNode level_5_node1 = new StringNode("办公室");
		StringNode level_5_node2 = new StringNode("企划部");
		StringNode level_5_node3 = new StringNode("人力资源部");
		StringNode level_5_node4 = new StringNode("市场拓展部");
		level_4_node1.setNode1(level_5_node1);
		level_4_node1.setNode2(level_5_node2);
		level_4_node1.setNode3(level_5_node3);
		level_4_node1.setNode4(level_5_node4);
		StringNode level_5_node5 = new StringNode("营运部");
		StringNode level_5_node6 = new StringNode("销售部");
		StringNode level_5_node7 = new StringNode("品控部");
		level_4_node2.setNode1(level_5_node5);
		level_4_node2.setNode2(level_5_node6);
		level_4_node2.setNode3(level_5_node7);
		StringNode level_5_node8 = new StringNode("采购部");
		StringNode level_5_node9 = new StringNode("工程部");
		StringNode level_5_node10 = new StringNode("中央厨房");
		StringNode level_5_node11 = new StringNode("研发部");
		level_4_node3.setNode1(level_5_node8);
		level_4_node3.setNode2(level_5_node9);
		level_4_node3.setNode3(level_5_node10);
		level_4_node3.setNode4(level_5_node11);
//		第六层
		StringNode level_6_node1 = new StringNode("培训部");
		StringNode level_6_node2 = new StringNode("档案部");
		StringNode level_6_node3 = new StringNode("招聘部");
		level_5_node3.setNode1(level_6_node1);
		level_5_node3.setNode2(level_6_node2);
		level_5_node3.setNode3(level_6_node3);
		StringNode level_6_node4 = new StringNode("快餐事业部");
		StringNode level_6_node5 = new StringNode("中餐事业部");
		level_5_node6.setNode1(level_6_node4);
		level_5_node6.setNode2(level_6_node5);
		StringNode level_6_node6 = new StringNode("设备维养部");
		StringNode level_6_node7 = new StringNode("工程筹建部");
		level_5_node9.setNode1(level_6_node6);
		level_5_node9.setNode2(level_6_node7);
		StringNode level_6_node8 = new StringNode("物流部");
		StringNode level_6_node9 = new StringNode("加工中心");
		level_5_node10.setNode1(level_6_node8);
		level_5_node10.setNode1(level_6_node9);
//		第七层
		StringNode level_7_node1 = new StringNode("分店一");
		StringNode level_7_node2 = new StringNode("分店二");
		StringNode level_7_node3 = new StringNode("分店三");
		level_6_node4.setNode1(level_7_node1);
		level_6_node4.setNode2(level_7_node2);
		level_6_node4.setNode3(level_7_node3);
		StringNode level_7_node4 = new StringNode("分店一");
		StringNode level_7_node5 = new StringNode("分店二");
		StringNode level_7_node6 = new StringNode("分店三");
		level_6_node5.setNode1(level_7_node4);
		level_6_node5.setNode2(level_7_node5);
		level_6_node5.setNode3(level_7_node6);
		
//		层次遍历
		System.out.println("层次遍历该树:");
		stringTree.levelShow();
		System.out.println();
	}
}

方式二

package com.bennett.test1006;

import java.util.ArrayList;
import java.util.List;

/**
 * @version:
 * @Description:结构树的测试类
 * @author bennett
 * @date: 2021年10月6日 下午10:52:29
 */ 
public class CompanysTest {
	static class Company{
		private String title;
		private Company parent;
		private List<Company> childs;
		public Company(String title, Company parent) {
			this.title = title;
			this.parent = parent;
			if(parent!=null ) {
				if(parent.childs==null) {
					parent.childs=new ArrayList<>();
				}
				parent.childs.add(this);
			}
		}
		
	}
	public static void main(String[] args) {
		Company root=new Company("股东大会", null);
//		List<Company> list=new ArrayList<>();
		Company company1=new Company("董事会", root);
		Company company2=new Company("监事会", root);
//		list.add(company1);
//		list.add(company2);
//		root.childs=list;
		
		Company company11=new Company("总经理", company1);
		Company company12=new Company("财务部", company1);
		Company company111=new Company("副总经理", company11);
		Company company112=new Company("副总经理", company11);
		Company company113=new Company("副总经理", company11);
		
		Company company1111=new Company("办公室", company111);
		Company company1112=new Company("企划部", company111);
		Company company1113=new Company("人力资源部", company111);
		Company company1114=new Company("市场拓展部", company111);
		
		Company company1121=new Company("营运部", company112);
		Company company1122=new Company("销售部", company112);
		Company company1123=new Company("品控部", company112);
		
		Company company1131=new Company("采购部", company113);
		Company company1132=new Company("工程部", company113);
		Company company1133=new Company("中央厨房", company113);
		Company company1134=new Company("研发部", company113);
		
		showCompanys(root,0);

	}
	private static void showCompanys(Company company, int level) {
		StringBuilder prefix=new StringBuilder();
		for (int i = 0; i < level; i++) {
			prefix.append("--");
		}
		System.out.println(prefix+company.title);
		if(company.childs==null) return;
		for (Company subCompany : company.childs) {
			showCompanys(subCompany,level+1);
		}
	}
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值