二叉樹(binary tree)是樹形結構的乙個重要型別。許多實際問題抽象出來的資料結構往往是二叉樹形式,即使是一般的樹也能簡單地轉換為二叉樹,而且二叉樹的儲存結構及其演算法都較為簡單,因此二叉樹顯得特別重要。二叉樹特點是每個結點最多只能有兩棵子樹,且有左右之分。
二叉樹是n個有限元素的集合,該集合或者為空、或者由乙個稱為根(root)的元素及兩個不相交的、被分別稱為左子樹和右子樹的二叉樹組成,是有序樹。當集合為空時,稱該二叉樹為空二叉樹。在二叉樹中,乙個元素也稱作乙個結點。
二叉樹中主要存在兩種特別的二叉樹,一種叫滿二叉樹,一種叫完全二叉樹。通俗來說就是滿二叉樹的所有父節點下面都是兩個子節點。完全二叉樹就是節點的編號和節點在二叉樹的位置相同。直接上圖:
二叉樹的儲存和鍊錶類似,但是它又有所不同,不同在於,二叉樹的左節點和右節點儲存的資料是需要進行判斷的。不能說這個資料都是隨機排布的。當然這個排序可以是從小到大,也可以是從大到小。我們直接看圖。
在存放資料的時候需要考慮的問題是,子節點是否為空,如果為空就可以直接新增資料,如果不為空需要繼續向下判斷,判斷要插入的資料於直接點的大小關係,總之乙個原則,父結點左邊的資料全都比父結點小(大),右邊的節點資料都比父結點大(小)即可。
現在用**來實現上述操作。
inte***ce
itree
class
treeimpl
implements
itree
else
this
.size ++;}
class
node
private
void
addnode
(node parentnode , node newnode)
else
}else
else}}
}}
在樹中新增資料和鍊錶新增資料雖然都是通過節點進行的,但是鍊錶的新增速度更快。而且使用的是雙指標的操作形式,而樹在每一次新增資料的時候都需要進行判斷,只有滿足某個條件之後才能將資料新增到節點上。不過好處在於排序上。如果說鍊錶也需要進行排序,那麼樹的排序速度是快於鍊錶的,因為每次判斷後,資料都會減半。
如果想要將二叉樹中的所有資料都查詢出來,有三種遍歷方式:
可以看出中序遍歷實際上就是對資料進行排序後輸出,所以這裡我就只實現中序遍歷,**實現為:
inte***ce
itree
class
treeimpl
implements
itree
@override
public t[
]toarraycentre()
class
node
treeimpl.
this
.returndata[treeimpl.
this
.len++]=
(t)this
.data;
//新增資料if(
this
.right!=null)}}
}
測試**
public
class
treedemo
}
二叉樹作為鍊錶的公升級版本,最大的優勢就在於資料的查詢上,相較於鍊錶來說,樹狀結構可以保證較高的查詢速度,最優的資料查詢效能為log2(n)
。在**中實現方式如下:
inte***ce
itree
class
treeimpl
implements
itree
class
node
else
else
}else
else}}
}}}
測試**
public
class
treedemo
}
相比於鍊錶來說,樹中的資料刪除是比較麻煩的,因為要設計到父節點的問題。如果你刪除的是葉子節點,那麼就可以直接刪除,但是如果是刪除的是父節點,你還需要將葉子節點中的乙個資料提上來做父結點。
**實現
inte***ce
itree
class
treeimpl
implements
itree
this
.root =
removenode
(deletenode);}
else
}this
.size--;}
private node removenode
(node deletenode)
else}if
((deletenode.left != null & deletenode.right == null)
||(deletenode.left == null & deletenode.right != null)
)else
if(deletenode.parent != null)
else
} movesubnode.parent = deletenode.parent;
//修改父節點}if
(deletenode.left != null && deletenode.right != null)
if(movesubnode.right != null)
else
} movesubnode.parent = deletenode.parent;
//改變移動節點的父節點
movesubnode.left = deletenode.left;
if(deletenode.right != movesubnode)
if(deletenode.parent != null)
else}}
return movesubnode;
}class
node
else
else
}else
else}}
}}}
**測試
public
class
treedemo
}
鍊錶是一種最為基礎的線性資料結構,在進行鍊錶操作的時候使用若干個節點進行資料的儲存,那麼在進行資料儲存的時候由於本身不具有排序的特點,所以在使用鍊錶查詢資料時,它的時間複雜度為「o(n)」,鍊錶可以實現的優化解決方案使用跳表方案來完成,實際上和二分查詢的意思相同,利用排序的模式,隨機抽取幾個中心點進行若干次比較,但是比鍊錶儲存結構更加高階一點的就是樹狀結構。 二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
資料儲存 二叉樹的鏈式儲存
陣列表示法用於完全二叉樹的儲存表示非常有效,但表示一般二叉樹則不是很理想。此外,在一棵樹中進行插入和刪除操作時,為了反應結點層次的變動,可能需要移動許多的結點,這樣降低了演算法的效率,而使用了鍊錶表示可以克服這樣的缺點。根據二叉樹的定義,可以設計出二叉樹節點的構造。二叉樹的每乙個結點至少應該包括三個...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...