根據樹的結構可以發現,在順序實現二叉樹時,如果樹不是滿二叉樹或者完全二叉樹,必須要在陣列對應位置空出位置以防後面再次新增元素時沒有位置,同時也保證了下標與父子節點的關係,這樣的後果就是陣列的利用率很低,極端的情況下如果n層的二叉樹每層只有乙個節點,按照這種方法仍然需要2^n-1個節點。所以順序實現一般不用,用的話也只用在滿二叉樹或者完全二叉樹上。
採用順序實現,下標的關係是最重要的點,要方便去遍歷節點,所以一般讓下標為0的節點空著不用,讓資料從下標為1的位置開始,這樣每次需要訪問左子節點就乘以二,右子節點就乘以二加一,相應地找父節點也只需要下標除以二即可。
**實現如下,沒什麼難度,由於只是建樹部分,所以**和給陣列初始化長得一樣
#include
using
namespace std;
int maxsize=
1005
;int n;
struct tree
;struct tree t;
void
init()
void
print()
}}intmain()
二叉樹最適合的結構就是鏈式結構,這種結構靈活新增節點正好與樹結構相配。一般需要宣告乙個指向樹根的結構體,乙個描述樹節點的結構體,前者也可以不用,換成乙個指向樹根的指標效果一樣。樹中節點含有三部分:儲存資料、左孩子指標、右孩子指標。
struct tree
;struct tree t;
struct tnode
;
一般的建樹根據需求分為好多種,下面的是很直接的層序建樹,一般涉及層序,都需要使用佇列來輔助,這是因為樹結構上的一層,看似是一層,但是從儲存的角度來看,這一層上非兄弟節點其實隔得很遠,所以使用乙個佇列,佇列裡面存放指向樹節點的指標,一開始將根節點放入佇列,每次取出佇列中的最前面元素,訪問資料後,如果有子節點,就將子節點先左後右放入佇列,利用佇列先進先出的特點,就實現了層序的效果。
對於層序建樹,也是和這個過程差不多。區別在於不知道孩子結點的位置是不是還有資料要放,所以稍微改變一下思路,先給樹根節點放上資料,因為樹根節點一定有資料,不然就沒有建樹的必要。之後將樹根節點入隊,每次取出佇列中的乙個元素,給這個元素的左右孩子初始化並賦值,賦值**隊,所有資料都已經新增進去。由於這樣操作相當於從佇列裡取乙個元素加兩個元素,所以要及時判斷是不是資料已空。
**如下:
#include
using
namespace std;
struct tree
;struct tree t;
struct tnode
;int num[
1005];
int n;
void
creat()
}void
print()
}}intmain()
二叉樹建樹
給出前序和中序建樹 node build int n,int pre,int in 給出中序和後序建樹 node build int n,int in,int pos uva 548 給你一棵樹的中序和後序遍歷,求從根到葉子組成的路徑中數字和最小的那條,輸出最小路徑的葉子。思路 在重建完二叉樹後,d...
資料結構 二叉樹 反轉二叉樹
include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...
二叉樹建樹 遍歷
首先需要乙個結構體,表示每乙個結點 typedef struct node btnode 然後就可以直接建樹了 示例是按前序遍歷 關於前序遍歷後面有解釋 建樹 void build btnode t t data data t lchild null t rchild null build t lc...