二叉樹:樹的每個節點最多只能有兩個子節點。
樹的效率:查詢節點的時間取決於這個節點所在的層數,每一層最多有2n-1個節點,總共n層共有2n-1個節點,那麼時間複雜度為o(logn),底數為2。
二叉搜尋樹要求:若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。
遍歷:
二叉樹的前、中、後序遍歷
前序遍歷
遞迴
public
void
preorderbt
(binarytree root)
非遞迴/**
* 前序遍歷非遞迴方式實現
* 非遞迴實現思路:二叉樹遍歷的遞迴實現很簡單,也很容易理解,在進行非遞迴實現時,需要用到棧這種資料結構(為什麼是棧,不是別的資料結構)。
* 因為遞迴實現的過程就是程式自己在處理圧棧和彈棧,改用非遞迴實現時,用棧模擬系統的圧棧與彈棧,就可以了。
*/public list
preorderbt1
(binarytree root)
//左邊的節點都走完了,需要改變節點方向if(
!stack.
isempty()
)}return preorderresult;
}
中序遍歷
遞迴
public
void
inorderbt
(binarytree root)
非遞迴/**
* 中序遍歷的非遞迴實現,與上述前序遍歷類似,只有稍許不同,注意
*/public list
inorderbt1
(binarytree root)
//到達最左邊,列印並改變方向if(
!stack.
isempty()
)}return inorderresult;
}
後序遍歷
遞迴
public
void
postorderbt
(binarytree root)
非遞迴/**
* 後序遍歷的非遞迴實現
* 技巧:妙用前序遍歷的非遞迴可以實現後序遍歷的非遞迴實現,這裡需要注意幾點改變:後序時,先遍歷右,再遍歷左,最後將得到的結果反向就好了
*/public list
postorderbt1
(binarytree root)if(
!stack.
isempty()
)}collections.
reverse
(postorderresult)
;return postorderresult;
}
二叉樹的最大深度public
intmaxdepth
(treenode root)
平衡二叉樹
思路:遞迴
private
boolean result =
true
;public
boolean
isbalanced
(treenode root)
public
intmaxdepth
(treenode root)
對稱二叉樹
思路:遞迴
public
boolean
issymmetric
(treenode root)
public
boolean
ismirror
(treenode t1, treenode t2)
if(t1 == null || t2 == null)
return
(t1.val == t2.val)
&&ismirror
(t1.right, t2.left)
&&ismirror
(t1.left, t2.right)
;}
翻轉二叉樹public treenode inverttree
(treenode root)
treenode right =
inverttree
(root.right)
; treenode left =
inverttree
(root.left)
; root.left = right;
root.right = left;
return root;
}
資料結構演算法 二叉樹
二叉樹資料結構 bintree.h include templateclass bintree template class treenode type data treenode lchild 左,右子樹 treenode rchild template class bintree void cr...
資料結構 樹和二叉樹
第一節 二叉樹的定義與基本操作 定義 我們把滿足以下兩個條件的樹型結構叫做二叉樹 binary tree 1 每個結點的度都不大於2 2 每個結點的孩子結點次序不能任意顛倒。由定義得出 二叉樹的每個結點只能含有0 1或2個孩子,且有左右之分。1 二叉樹的五種基本形態 2 二叉樹性質 性質1 二叉樹第...
資料結構 樹和二叉樹
定義 二叉樹是n n 0 個節點的有限集合,該集合或者為空集 稱為空二叉樹 或者由乙個根節點和兩棵互不相交的 分別稱為根節點的左子樹和右子樹的二叉樹組成。特點 每個節點最多有兩棵子樹 二叉樹是有序的,其次序不能任意顛倒 斜樹 1.所有節點都只有左子樹的二叉樹稱為左斜樹 2.所有節點都只有右子樹的二叉...