完全二叉樹是由滿二叉樹而引出來的,若設二叉樹的深度為h,除第 h 層外,其它各層 (1~h-1) 的結點數都達到最大個數(即1~h-1層為乙個滿二叉樹),第 h 層所有的結點都連續集中在最左邊,這就是完全二叉樹。
下面來放一張完全二叉樹示例圖
可以看到上面的二叉樹都是在當前層達到最大節點,然後再往下一層從左往右新增新的節點,一定要注意是從左往右。
然後我們看下面的,這就不是完全二叉樹,因為它不滿足我們上面所說的從左往右放,要理解這一點,對我們以後用程式實現建立完全二叉樹墊下基礎。
}1.先來看一張圖,方便理解陣列轉換成完全二叉樹建立的過程。
**解釋:從上面的圖我們看到頂上藍色的就是完全二叉樹,而靠下部的列表就是生成完全二叉樹的資料來源,每次當前資料的index都是父類傳過來的index,當我們第一次呼叫的時候肯定index = 0,然後開始遍歷,左孩子的index等於它的父節點的index * 2 + 1,右孩子的index就是等於它的父節點的index * 2 + 2。
也就是我們看到中我寫了乙個綠色的公式,這裡說的index就是我們去資料來源拿資料的位置,然後經過遞迴之後,完全二叉數就完成了建立。 **
下面附上完全二叉樹的**
/**
* 完全二叉樹
* @author yong.su
* * @param */
public
class
completetree
comparable
>
/* * 中序遍歷
*/public
void
midorder()
throws exception
/* * 先序遍歷
*/public
void
preorder()
throws exception
/* * 計算深度
*/public
intcaculatedepth()
throws exception
/* * 找到對應的節點
*/public node
findnode
(t data)
throws exception
/* * 找到對應的節點的父節點
*/public node
findnodeparent
(t data)
throws exception
/** * 建立完全二叉樹
* @param arr 源資料
* @param index 當前索引值
* @return 建立好的節點
*/private node
createcompletetree
(t arr,
int index)
return newnode;
}/**
* 中序遍歷
* @param node
*/private
void
midorder
(node
node)
/** * 先序遍歷
* @param node
*/private
void
preorder
(node
node)
/** * 計算深度
* @param node 根節點
* @return 深度
*/private
intcaculatedepth
(node
node)
else}}
/** * 找到對應的節點
* 這裡與二叉搜尋樹的查詢方式是不一樣的。
* @param data 查詢的元素
* @param root 根節點
* @return 返回對應的節點否則為null
*/private node
findnode
(t data,node
root)
node
treenode = null;
if(root.leftchild != null)
int compareresult = data.
compareto
(root.data);if
(compareresult ==0)
return root;
if(root.rightchild !=null)
return treenode;
}/**
* 找到對應的節點的父節點
* @param root 根節點
* @param data 查詢的元素
* @return 對應的節點的父節點否則返回null
*/private node
findnodeparent
(node
root, t data)
}
下面就是呼叫的過程以及執行結果:
public
static
void
main
(string[
] args)
throws exception
; tree.
create
(arr)
; tree.
preorder()
; system.out.
println
(tree.
caculatedepth()
);system.out.
println
(tree.
findnode(2
).data)
; system.out.
println
(tree.
findnodeparent(12
).data)
;}
執行結果:
ps:純屬個人理解,希望指正!
遞迴實現二叉樹
二叉樹是一種非線性結構,用途廣泛。二叉樹的每個結點的度都不大於2,所以一般用二叉鍊錶來實現二叉樹。二叉樹可以分為根結點,左子樹和右子樹,左子樹 右子樹依然這麼劃分,所以用遞迴實現二叉樹的邏輯是比較簡單的,只需不斷對子樹進行劃分即可。include include include using name...
二叉樹,完全二叉樹,滿二叉樹
二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...
二叉樹和完全二叉樹
二叉樹規律 假設根節點的高度為0 二叉樹是每個節點至多只有兩個節點的樹 深度為i所在的層至多有 2 i個節點 高度為k的二叉樹至多有2 k 1 1個節點 n0表示度為0的節點,n2表示度為2的節點,存在n0 n2 1 對所有樹有 節點個數 邊數 1 完全二叉樹規律 節點數為n的完全二叉樹,其高度為 ...