什麼是二叉樹?
在計算機科學中,二叉樹是每個節點最多有兩個子樹的樹結構。通常子樹被稱作“左子樹”和“右子樹”,左子樹和右子樹同時也是二叉樹。二叉樹的子樹有左右之分,並且次序不能任意顛倒。二叉樹是遞歸定義的,所以一般二叉樹的相關功能操作需要依靠遞歸實現.
創建一個節點類
定義節點類Node,分爲三個部分,第一個部分存儲元素,元素類型可以爲object;這裏我們一般存儲int數據;另外兩個部分就是子代左右樹節點;連接下一次樹節點結構.
public class Node {
Object value;//存儲數值元素
Node leftChild;//定義子代左樹節點
Node rightChild;//定義子代右樹節點
public Node(Object value){
this.value = value;
}
public Node(Object value,Node left,Node right){
super();
this.value = value;
this.leftChild =left;
this.rightChild =right;
}
//節點toString方法
public String toString() {
return "Node [value=" + value + ", leftChild=" + leftChild + ", rightChild=" + rightChild + "]";
}
}
創建二叉樹類
public class LinkedBinaryTree implements BinaryTree {
//定義根節點
private Node root;
public LinkedBinaryTree(Node root) {
super();
this.root = root;
}
public LinkedBinaryTree() {
super();
}
//判斷樹是否爲空
public boolean isEmpty() {
return root == null;
}
//返回樹節點數
public int size() {
return size(root);
}
public int size(Node root) {
if(root == null){
return 0;
}
//遞歸調用得到左右子代樹節點個數 逐一累加後返回最終節點數
int left = size(root.leftChild);
int right =size(root.rightChild);
return left +right +1;
}
//獲得樹結構的層數
public int getHeight() {
return getHeight(root);
}
private int getHeight(Node root) {
if(root == null){
return 0;
}
int left = getHeight(root.leftChild);
int right = getHeight(root.rightChild);
return left > right? left+1: right+1;
}
//在樹結構中查找包含指定數值的樹節點
public Node findKey(int value) {
return findKey(value,root);
}
private Node findKey(Object value, Node root) {
if(root == null){
return null;
}else if(root != null && root.value ==value ){
return root;
}else{
Node no1 = findKey(value,root.leftChild);
Node no2 = findKey(value,root.rightChild);
if(no1 != null && no1.value==value){
return no1;
}else if(no2 != null && no2.value==value){
return no2;
}else{
return null ;
}
}
}
//前序列節點遍歷
public void preOrderTraverse() {
if(root != null){
System.out.print(root.value+" ");
BinaryTree leftTree = new LinkedBinaryTree(root.leftChild);
leftTree.preOrderTraverse();
BinaryTree rightTree = new LinkedBinaryTree(root.rightChild);
rightTree.preOrderTraverse();
}
}
//中序列節點遍歷
public void inOrderTraverse() {
if(root != null){
BinaryTree leftTree = new LinkedBinaryTree(root.leftChild);
leftTree.inOrderTraverse();
System.out.print(root.value+" ");
BinaryTree rightTree = new LinkedBinaryTree(root.rightChild);
rightTree.inOrderTraverse();
}
}
//後序列節點遍歷
public void postOrderTraverse() {
if(root != null){
BinaryTree leftTree = new LinkedBinaryTree(root.leftChild);
leftTree.inOrderTraverse();
BinaryTree rightTree = new LinkedBinaryTree(root.rightChild);
rightTree.inOrderTraverse();
System.out.print(root.value+" ");
}
}
//按照層次遍歷樹節點數值
public void levelOrderByStack() {
if(root == null){
return;
}
//引用隊列存儲節點 先進先出的原則
Queue<Node> que = new LinkedList<Node>();
que.add(root);
while(que.size() != 0){
int len =que.size();
for(int i =0;i<len;i++){
Node temp =que.poll();
System.out.print(temp.value+" ");
if(temp.leftChild != null) que.add(temp.leftChild);
if(temp.rightChild != null) que.add(temp.rightChild);
}
}
System.out.println();
}
}
主要的二叉樹結構框架已經構造完成,現在在測試類中添加入節點元素並創建一個二叉樹對象即可操作執行二叉樹相關功能
注意:樹節點元素添加中樹節點的創建應該是從葉節點往根節點從下往上的順序創建添加
Node node5 = new Node(5,null,null);
Node node4 = new Node(4, null, node5);
Node node7 = new Node(7, null, null);
Node node6 = new Node(6, null, node7);
Node node3 = new Node(3, null, null);
Node node2 = new Node(2, node3, node6);
Node node1 = new Node(1, node4, node2);
BinaryTree Tree = new LinkedBinaryTree(node1);
二叉樹功能代碼大多依賴遞歸思想,同時遞歸算法也實際開發中重要的核心思想,其中部分功能不通過遞歸方式也能實現,我們使用遞歸方式的優點是代碼簡單,閱讀性良好,缺點是對內存空間開闢消耗較大. 我在後期會提供二叉樹的非遞歸功能代碼實現.