二叉樹
二叉樹的概念
- 定義:每個節點最多只能有兩個子節點的一種形式稱之爲二叉樹
- 二叉樹的節點分爲左節點和右節點
圖示:
- 滿二叉樹:二叉樹的所有葉子節點(無分叉的節點)都在最後一層,並且總結點數爲2n- 1,n爲層數
圖示:
- 完全二叉樹:所有的葉子節點都在最後一層或者是倒數第二層,並且最後一層左邊連續,倒數第二層右邊連續。連續就是都是這一層的。
圖示:
二叉樹的遍歷方式
基本概念
- 前序遍歷:先輸出父節點,在遍歷左子樹和右子樹
- 中序遍歷:先遍歷左子樹,在輸出父節點,在遍歷右子樹
- 後序遍歷:先遍歷左子樹,再遍歷右子樹,最後輸出父節點
** 父節點的輸出先後決定其實遍歷的順序**
思路分析
- 創建一個二叉樹
- 遍歷:
- 前序遍歷:
- 輸出當前節點
- 判斷:如果左子節點不爲空,那就繼續前序遍歷
- 判斷:如果右子節點不爲空,那就繼續前序遍歷
- 中序遍歷:
- 如果當前節點的左子節點不爲空,則遞歸中序遍歷
- 輸出當前節點
- 如果當前節點右子節點不爲空,那就遞歸中序遍歷
- 後序遍歷:
- 如果當前節點的左子節點不爲空,那就遞歸左子節點
- 如果當前節點的右子節點不爲空,那就遞歸右子節點
- 輸出當前節點
代碼實現:
class BinaryTree{
private HeroNode root;
public BinaryTree(HeroNode root) {
this.root = root;
}
public BinaryTree() {
}
public boolean isEmpty(){
if (root == null){
return false;
}else{
return true;
}
}
public void preOrder(){
if (isEmpty()){
System.out.println("當前樹爲空,無法遍歷");
}else{
root.preOrder();
}
}
public void minOrder(){
if (isEmpty()){
System.out.println("當前樹爲空,無法遍歷");
}else{
root.midOrder();
}
}
public void postOrder(){
if (isEmpty()){
System.out.println("當前樹爲空,無法遍歷");
}else{
root.postOrder();
}
}
}
class HeroNode{
private int heroNo;
private String heroName;
HeroNode left;
HeroNode right;
public HeroNode(int heroNo, String heroName) {
this.heroNo = heroNo;
this.heroName = heroName;
}
public HeroNode getLeft() {
return left;
}
public HeroNode getRight() {
return right;
}
public void setLeft(HeroNode left) {
this.left = left;
}
public void setRight(HeroNode right) {
this.right = right;
}
@Override
public String toString() {
return "HeroNode{" +
"heroNo=" + heroNo +
", heroName='" + heroName + '\'' +
'}';
}
public void preOrder(){
System.out.println(this);
if(this.left != null){
this.left.preOrder();
}
if (this.right != null){
this.right.preOrder();
}
}
public void midOrder(){
if(this.left != null){
this.left.midOrder();
}
System.out.println(this);
if (this.right != null){
this.right.midOrder();
}
}
public void postOrder(){
if(this.left != null){
this.left.postOrder();
}
if (this.right != null){
this.right.postOrder();
}
System.out.println(this);
}
分析與總結
- 創建節點,必須有權值,同時還有指向左右兩個子節點的索引,同時還有對應的增刪改除的方法,但是真正調用方法的還是樹結構
- 創建一個樹的類必須創建根節點,同時還有對於節點的操作方法,能夠操作樹的的各個節點
- 對於遍歷的方法而言,必須先判定是否爲空,否則會出現空指針