二叉樹的概念
- 1)如果該二叉樹的所有葉子節點都在最後一層,並且結點總數= 2^n -1 , n 爲層數,則我們稱爲滿二叉樹。
- 2)如果該二叉樹的所有葉子節點都在最後一層或者倒數第二層,而且最後一層的葉子節點在左邊連續,倒數第二層的葉子節點在右邊連續,我們稱爲完全二叉樹。
二叉樹遍歷
前序遍歷: 先輸出父節點,再遍歷左子樹和右子樹
中序遍歷: 先遍歷左子樹,再輸出父節點,再遍歷右子樹
後序遍歷: 先遍歷左子樹,再遍歷右子樹,最後輸出父節點
小結: 看輸出父節點的順序,就確定是前序,中序還是後序
思路:
前序遍歷
//編寫前序遍歷的方法
public void preOrder() {
System.out.println(this); //先輸出父結點
//遞歸向左子樹前序遍歷
if(this.left != null) {
this.left.preOrder();
}
//遞歸向右子樹前序遍歷
if(this.right != null) {
this.right.preOrder();
}
}
中序遍歷
//中序遍歷
public void infixOrder() {
//遞歸向左子樹中序遍歷
if(this.left != null) {
this.left.infixOrder();
}
//輸出父結點
System.out.println(this);
//遞歸向右子樹中序遍歷
if(this.right != null) {
this.right.infixOrder();
}
}
後續遍歷
//後序遍歷
public void postOrder() {
if(this.left != null) {
this.left.postOrder();
}
if(this.right != null) {
this.right.postOrder();
}
System.out.println(this);
}
二叉樹查找思路分析
public HeroNode preOrderSearch(int no) {
System.out.println("進入前序遍歷");
//比較當前結點是不是
if(this.no == no) {
return this;
}
//1.則判斷當前結點的左子節點是否爲空,如果不爲空,則遞歸前序查找
//2.如果左遞歸前序查找,找到結點,則返回
HeroNode resNode = null;
if(this.left != null) {
resNode = this.left.preOrderSearch(no);
}
if(resNode != null) {//說明我們左子樹找到
return resNode;
}
//1.左遞歸前序查找,找到結點,則返回,否繼續判斷,
//2.當前的結點的右子節點是否爲空,如果不空,則繼續向右遞歸前序查找
if(this.right != null) {
resNode = this.right.preOrderSearch(no);
}
return resNode;
}
刪除結點思路
思路
- 1. 因爲我們的二叉樹是單向的,所以我們是判斷當前結點的子結點是否需要刪除結點,而不能去判斷當前這個結點 是不是需要刪除結點.
- 2. 如果當前結點的左子結點不爲空,並且左子結點 就是要刪除結點,就將this.left = null; 並且就返回(結束遞歸刪除)
- 3. 如果當前結點的右子結點不爲空,並且右子結點 就是要刪除結點,就將this.right= null ;並且就返回(結束遞歸刪除)
- 4. 如果第2和第3步沒有刪除結點,那麼我們就需要向左子樹進行遞歸刪除
- 5. 如果第4步也沒有刪除結點,則應當向右子樹進行遞歸刪除.
public void delNode(int no) {
//2. 如果當前結點的左子結點不爲空,並且左子結點 就是要刪除結點,就將this.left = null; 並且就返回(結束遞歸刪除)
if(this.left != null && this.left.no == no) {
this.left = null;
return;
}
//3.如果當前結點的右子結點不爲空,並且右子結點 就是要刪除結點,就將this.right= null ;並且就返回(結束遞歸刪除)
if(this.right != null && this.right.no == no) {
this.right = null;
return;
}
//4.我們就需要向左子樹進行遞歸刪除
if(this.left != null) {
this.left.delNode(no);
}
//5.則應當向右子樹進行遞歸刪除
if(this.right != null) {
this.right.delNode(no);
}
}