遞迴實現完全二叉樹

2021-10-10 10:22:28 字數 3612 閱讀 2439

完全二叉樹是由滿二叉樹而引出來的,若設二叉樹的深度為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的完全二叉樹,其高度為 ...