資料儲存 二叉樹

2021-10-24 13:21:44 字數 3341 閱讀 6423

二叉樹(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...