Java數據結構(15)----二叉樹的三種遍歷

你未必出類拔萃,但一定與衆不同

二叉樹

在計算機科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。
一棵深度爲k,且有2^k-1個結點的二叉樹,稱爲滿二叉樹。這種樹的特點是每一層上的結點數都是最大結點數。而在一棵二叉樹中,除最後一層外,若其餘層都是滿的,並且或者最後一層是滿的,或者是在右邊缺少連續若干結點,則此二叉樹爲完全二叉樹。具有n個結點的完全二叉樹的深度爲floor(log2n)+1。深度爲k的完全二叉樹,至少有2k-1個葉子結點,至多有2k-1個結點。

三種遍歷方式

先序遍歷 根左右

首先訪問根,再先序遍歷左子樹,最後先序遍歷右子樹
在這裏插入圖片描述

中序遍歷 左根右

首先中序遍歷左子樹,再訪問根,最後中序遍歷右子樹
在這裏插入圖片描述

後序遍歷 左右根

首先後序遍歷左子樹,再後序遍歷右子樹,最後訪問根
在這裏插入圖片描述

代碼如下:

public class BinaryTreeTest {

	public static void main(String[] args) {
		BinaryTree binaryTree = new BinaryTree();
		Student student1 = new Student(1, "趙一",20,"1801班");
		Student student2 = new Student(2, "錢二",20,"1802班");
		Student student3 = new Student(3, "張三",20,"1803班");
		Student student4 = new Student(4, "李四",20,"1804班");
		Student student5 = new Student(5, "王五",20,"1805班");
		Student student6 = new Student(6, "孫六",20,"1806班");
		Student student7 = new Student(7, "李七",20,"1807班");
		//創建需要的結點
		TreeNode root = new TreeNode(student1);
		TreeNode node2 = new TreeNode(student2);
		TreeNode node3 = new TreeNode(student3);
		TreeNode node4 = new TreeNode(student4);
		TreeNode node5 = new TreeNode(student5);
		TreeNode node6 = new TreeNode(student6);
		TreeNode node7 = new TreeNode(student7);
		
		//手動創建該二叉樹
		root.setLeftNode(node2);
		root.setRightNode(node3);
		node2.setLeftNode(node4);
		node2.setRightNode(node5);
		node3.setRightNode(node7);
		node3.setLeftNode(node6);
		binaryTree.setRootNode(root);
		
		//測試
		System.out.println("前序遍歷"); 
		binaryTree.preOrder();
		System.out.println("中序遍歷"); 
		binaryTree.InOrder();
		System.out.println("後序遍歷"); 
		binaryTree.PostOrder();
	}

}
class BinaryTree{
	private TreeNode rootNode;

	public TreeNode getRootNode() {
		return rootNode;
	}

	public void setRootNode(TreeNode rootNode) {
		this.rootNode = rootNode;
	}
	//前序遍歷
	public void preOrder() {
		if(this.rootNode != null) {
				this.rootNode.PreOrder();
		}else {
				System.out.println("二叉樹爲空,無法遍歷");
		}
	}

	//中序遍歷
	public void InOrder() {
		if(this.rootNode != null) {
			this.rootNode.InOrder();
		}else {
			System.out.println("二叉樹爲空,無法遍歷");
		}
	}
	//後序遍歷
	public void PostOrder() {
		if(this.rootNode != null) {
			this.rootNode.PostOrder();
		}else {
			System.out.println("二叉樹爲空,無法遍歷");
		}
	}	
}
/**
 * 學生實體類
 */
class Student{
	private int id;
	private String name;
	private int age;
	private String stu_class;
	public Student(int id,String name,int age,String stu_class) {
		this.id = id;
		this.name = name;
		this.age = age;
		this.stu_class = stu_class;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getStu_class() {
		return stu_class;
	}
	public void setStu_class(String stu_class) {
		this.stu_class = stu_class;
	}
	@Override
	public String toString() {
		return "Student [id=" + id + ", name=" + name + ", age=" + age + ", stu_class=" + stu_class + "]";
	}
	
}
//二叉樹節點
class TreeNode{
	//數據域
	private Student student;
	//左孩子
	private TreeNode leftNode;
	//右孩子
	private TreeNode rightNode;
	
	public TreeNode(Student student) {
		this.student = student;
	}
	
	public Student getStudent() {
		return student;
	}

	public void setStudent(Student student) {
		this.student = student;
	}

	public TreeNode getLeftNode() {
		return leftNode;
	}

	public void setLeftNode(TreeNode leftNode) {
		this.leftNode = leftNode;
	}

	public TreeNode getRightNode() {
		return rightNode;
	}

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

	@Override
	public String toString() {
		return "TreeNode [student=" + student + ", leftNode=" + leftNode + ", rightNode=" + rightNode + "]";
	}

	//前序遍歷 根左右
	public void PreOrder() {
		System.out.println(this);
		if(this.leftNode!=null) {
			this.leftNode.PreOrder();
		}
		if(this.rightNode!=null) {
			this.rightNode.PreOrder();
		}
	}
	//中序遍歷 左根右
	public void InOrder() {
		
		if(this.leftNode!=null) {
			this.leftNode.InOrder();
		}
		System.out.println(this);
		if(this.rightNode!=null) {
			this.rightNode.InOrder();
		}
	}
	//後序遍歷 左右根
	public void PostOrder() {
			
		if(this.leftNode!=null) {
			this.leftNode.PostOrder();
		}
			
		if(this.rightNode!=null) {
			this.rightNode.PostOrder();
		}
		System.out.println(this);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章