樹結構出現的原因:
二叉樹示意圖:
常用用語:
葉子節點:沒有子節點的節點。
節點的權:節點值。
路徑:從根節點找到該節點的一條路。
樹的高度:也就是最大層數。
二叉樹概念:每個節點最多只能有兩個子節點稱為二叉樹。
二叉樹的節點分為左子節點和右子節點。
前序遍歷:先輸出父節點,然後遍歷左子樹右子樹。即先輸出該節點,如果左子節點不為空,遞迴遍歷左子節點,如果右子節點不為空,遞迴遍歷右子節點。
中序遍歷:先遍歷左子樹,然後輸出父節點,然後遍歷右子樹。即如果左子節點不為空,遞迴遍歷左子節點。輸出該節點。如果右子節點不為空,遞迴遍歷右子節點。
後序遍歷:先遍歷左子樹右子樹,最後輸出父節點。即如果左子節點不為空,遞迴遍歷左子節點,如果右子節點不為空,遞迴遍歷右子節點。最後輸出該節點。
區分三種遍歷方式:看何時輸出根節點,如果一開始就輸出根節點,為前序遍歷;如果最後輸出根節點,為後序遍歷;如果在中間輸出根節點,為中序遍歷。
//二叉樹
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...
二叉樹遍歷與查詢簡單刪除
使用前序,中序和後序對下面的二叉樹進行遍歷.前序遍歷 先輸出父節點,再遍歷左子樹和右子樹 中序遍歷 先遍歷左子樹,再輸出父節點,再遍歷右子樹 後序遍歷 先遍歷左子樹,再遍歷右子樹,最後輸出父節點 小結 看輸出父節點的順序,就確定是前序,中序還是後序 如果刪除的節點是葉子節點,則刪除該節點 如果刪除的...
二叉樹遍歷與查詢簡單刪除
使用前序,中序和後序對下面的二叉樹進行遍歷.前序遍歷 先輸出父節點,再遍歷左子樹和右子樹 中序遍歷 先遍歷左子樹,再輸出父節點,再遍歷右子樹 後序遍歷 先遍歷左子樹,再遍歷右子樹,最後輸出父節點 小結 看輸出父節點的順序,就確定是前序,中序還是後序 如果刪除的節點是葉子節點,則刪除該節點 如果刪除的...