學習筆記 二叉樹遍歷 查詢 刪除

2021-10-22 12:00:34 字數 3647 閱讀 7609

樹結構出現的原因:

二叉樹示意圖:

常用用語:

葉子節點:沒有子節點的節點。

節點的權:節點值。

路徑:從根節點找到該節點的一條路。

樹的高度:也就是最大層數。

二叉樹概念:每個節點最多只能有兩個子節點稱為二叉樹。

二叉樹的節點分為左子節點和右子節點。

前序遍歷:先輸出父節點,然後遍歷左子樹右子樹。即先輸出該節點,如果左子節點不為空,遞迴遍歷左子節點,如果右子節點不為空,遞迴遍歷右子節點。

中序遍歷:先遍歷左子樹,然後輸出父節點,然後遍歷右子樹。即如果左子節點不為空,遞迴遍歷左子節點。輸出該節點。如果右子節點不為空,遞迴遍歷右子節點。

後序遍歷:先遍歷左子樹右子樹,最後輸出父節點。即如果左子節點不為空,遞迴遍歷左子節點,如果右子節點不為空,遞迴遍歷右子節點。最後輸出該節點。

區分三種遍歷方式:看何時輸出根節點,如果一開始就輸出根節點,為前序遍歷;如果最後輸出根節點,為後序遍歷;如果在中間輸出根節點,為中序遍歷。

//二叉樹

class

binarytree

//中序遍歷

public

void

midorder()

//後序遍歷

public

void

postorder()

}//單個英雄節點

class

heroif(

this

.right!=null)

}//中序遍歷

public

void

midorder()

system.out.

println

(this);

if(this

.right!=null)

}//後序遍歷

public

void

postorder()

if(this

.right!=null)

system.out.

println

(this);

}public

hero

(int no, string name)

@override

public string tostring()

';}}

前序查詢:先看本節點是不是,是就直接返回,不是的話考慮是否有左子節點,有的話對左子節點遞迴查詢,查到就直接返回,沒查到時考慮是否有右子節點,有的話對右子節點遞迴查詢,最後返回結果。

中序查詢:考慮是否有左子節點,有的話對左子節點遞迴查詢,查到就直接返回,沒查到時比較本結點是不是,是就直接返回,不是的話考慮是否有右子節點,有的話對右子節點遞迴查詢,最後返回結果。

後續查詢:考慮是否有左子節點,有的話對左子節點遞迴查詢,查到就直接返回,沒查到時考慮是否有右子節點,有的話對右子節點遞迴查詢,查到就直接返回,沒查到比較本節點,最後返回結果。

節點方法

//前序查詢

public hero preordersearch

(int no)

hero resnode=null;

//沒找到就找左子樹if(

this

.left!=null)

//左子樹找到了就不用繼續

if(resnode!=null)

//沒找到就找右子樹if(

this

.right!=null)

//不管找沒找到都返回

return resnode;

}//中序查詢

public hero midordersearch

(int no)

if(resnode!=null)

system.out.

println

("中序···");

if(this

.no==no)if(

this

.right!=null)

return resnode;

}//後序查詢

public hero postordersearch

(int no)

if(resnode!=null)if(

this

.right!=null)

if(resnode!=null)

system.out.

println

("後序···");

if(this

.no==no)

return resnode;

}

二叉樹呼叫

//前序查詢

public hero preordersearch

(int no)

else

}//中序查詢

public hero midordersearch

(int no)

else

}//後序查詢

public hero postordersearch

(int no)

else

}

刪除的規則:如果是葉子節點,就直接刪除該節點,如果不是葉子節點,就刪除該子樹。

思路:首先單獨考慮空樹和只有根節點的情況。其次,為了刪除,我們應該定位到需刪除節點的父節點,然後將父節點的左或右置空。所以預設判斷的是根節點的下方節點。邏輯如下:如果左子節點不為空且就是要刪除的,就把左子節點置空,返回;否則判斷,如果右子節點不為空且是要刪除的,把右子節點置空返回,否則,如果左子節點不為空,向左遞迴刪除,然後向右遞迴刪除。

存在的問題就是如果在左遞迴的過程中找到並刪除了該節點,還會繼續進行右遞迴,可以考慮用乙個布林值標記。

節點**

//刪除節點

public

void

delnode

(int no)

//不是左子節點就看看是不是右子節點,是就刪了if(

this

.right!=null&&

this

.right.no==no)

//都不是就向左遞迴查詢刪除if(

this

.left!=null)

//左邊沒有就找右邊if(

this

.right!=null)

}

樹**

//刪除節點

public

void

delnode

(int no)

else

}else

}

二叉樹遍歷查詢

1 前序遍歷 先輸出父節點,再遍歷左子樹和右子樹 2 中序遍歷 先遍歷左子樹,再輸出父節點,再遍歷右子樹 3 後序遍歷 先遍歷左子樹,再遍歷右子樹,最後輸出父節點 4 小結 看輸出父節點的順序,就確定是前序,中序還是後序 package com.atguigu.tree public class b...

二叉樹遍歷與查詢簡單刪除

使用前序,中序和後序對下面的二叉樹進行遍歷.前序遍歷 先輸出父節點,再遍歷左子樹和右子樹 中序遍歷 先遍歷左子樹,再輸出父節點,再遍歷右子樹 後序遍歷 先遍歷左子樹,再遍歷右子樹,最後輸出父節點 小結 看輸出父節點的順序,就確定是前序,中序還是後序 如果刪除的節點是葉子節點,則刪除該節點 如果刪除的...

二叉樹遍歷與查詢簡單刪除

使用前序,中序和後序對下面的二叉樹進行遍歷.前序遍歷 先輸出父節點,再遍歷左子樹和右子樹 中序遍歷 先遍歷左子樹,再輸出父節點,再遍歷右子樹 後序遍歷 先遍歷左子樹,再遍歷右子樹,最後輸出父節點 小結 看輸出父節點的順序,就確定是前序,中序還是後序 如果刪除的節點是葉子節點,則刪除該節點 如果刪除的...