你未必出類拔萃,但一定與衆不同
二叉樹
在計算機科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”(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);
}
}