資料結構 二叉樹遍歷(基於遞迴實現)

2021-08-19 14:14:49 字數 3457 閱讀 6297

二叉樹的儲存結構主要了解二叉鍊錶結構,也就是乙個資料域,兩個指標域,(分別為指向左右孩子的指標)

typedef

char datatype;

typedef

struct bintreenode

bintreenode;

在本文中,我們要構建一棵如下圖中的不完全二叉樹,他的遍歷結果如下圖中所示

建立二叉樹

//建立節點

bintreenode * bintreenodecreate(datatype value)

//建立二叉樹

bintreenode* bintreecreate(datatype *arr,size_t size,size_t *index,datatype null_node)

//如果index不在有效範圍內

if(*index>=size)

//如果該節點為空節點

if(arr[*index]==null_node)

//建立根節點

bintreenode* newnode=bintreenodecreate(arr[*index]);

//建立左孩子

++(*index);

newnode->pleft=bintreecreate(arr,size,index,null_node);

//建立右孩子

++(*index);

newnode->pright=bintreecreate(arr,size,index,null_node);

return newnode;

}

先序遍歷:首先訪問根節點,然後遍歷訪問左子樹,最後遍歷訪問右子樹

//二叉樹的初始化

void bintreeinit(bintreenode** root)

*root=null;

return ;

}

先序遍歷:首先訪問根節點,然後訪問根節點的左子樹,最後訪問根節點的右子樹

(這裡的訪問是指列印,當然還有其他訪問方式,如比較,銷毀等等)

在途中,藍色線條圈住的屬於同一顆子樹,數字標號表示走的順序

//先序遍歷

void bintreepreorder(bintreenode* root)

//先訪問根節點

printf( "%c ",root->

data);

//再遞迴訪問左左子樹

bintreepreorder(root->pleft);

//最後遞迴遍歷右子樹

bintreepreorder(root->pright);

return;

}

中序遍歷:首先訪問根節點的左子樹,然後訪問根節點,最後訪問右子樹

如果左右子樹還有子數,則重複上述步驟

//中序遍歷

void bintreeinorder(bintreenode* root)

//先遞迴遍歷左子樹

bintreeinorder( root->pleft);

//在訪問根節點

printf("%c "root->

data);

//最後遍歷訪問右子樹

bintreeinorder( root->pright);

return ;

}

後續遍歷:先訪問根節點的左子樹,然後訪問右子樹,最後訪問根節點

特點:後序遍歷。最後乙個元素必定是根節點

//後續遍歷

void bintreepostorder(bintreenode* root)

//先遞迴遍歷左子樹

bintreepostorder( root->pleft);

//然後遍歷訪問右子樹

bintreepostorder( root->pright);

//最後訪問根節點

printf("%c ",root->

data);

return ;

}

層序遍歷:從根節點點出發,從上到下,從左到右,依次訪問。

二叉樹的層序遍歷的實現還是比較簡單的,由於其層級的關係,很明顯要用到佇列來輔助實現,主要是從左向右,自上而下,依次將二叉樹的各節點入隊,這樣便可以保證輸出的順序是層序排列的。下面是演算法的實現思想:

先將樹的根節點入隊,

如果佇列不空,則進入迴圈

//層序遍歷

void bintreeleveorder(bintreenode* root)

seqqueueinit(&

queue);

//將根節點入佇列

seqqueuepush(&

queue,root);

//迴圈訪問二叉樹的左右子樹

while( 1)

//訪問隊首元素

printf("%c ",front->

data);

//將隊首出佇列

seqqueuepop(&

queue);

//將左子樹根節點插入佇列

if(front->pleft)

//將右子樹根節點插入佇列

if(front->pright)

}}

由於二叉樹結構根節點便可以找到其他任何節點,所以銷毀時,儲存根節點,然後遞迴遍歷銷毀左右子樹,最後銷毀根節點

二叉樹的每個節點都是通過malloc申請所得,所謂銷毀就是free掉malloc申請的節點,並置為null,防止野指標出現

//銷毀二叉樹

void bintreedestory(bintreenode* root)

//銷毀左子樹

if(root->pleft)

//銷毀右子樹

if(root->pright)

//銷毀根節點

if(root)

}

當然,也可以按照別的遍歷順序實現銷毀,只要在銷毀根節點之前先儲存左右子樹即可。

遍歷二叉樹(資料結構,遞迴)

在二叉樹的應用中,常常要求在樹中查詢具有某種特徵的結點,或者對全部結點逐一進行某種處理。這就是二叉樹的遍歷問題。所謂二叉樹的遍歷是指按一定的規律和次序訪問樹中的各個結點,而且每個結點僅被訪問一次。訪問 的含義很廣,可以是對結點作各種處理,如輸出結點的資訊等。遍歷一般按照從左到右的順序,共有3種遍歷方...

資料結構 二叉樹遍歷非遞迴實現

資料結構中二叉樹的遍歷主要分為先序,中序和後序。順序是相對根節點來說的。先序中序非遞迴實現比較簡單,後序較為複雜些,需要判斷右子樹是否為空或遍歷完。以下為三種遍歷方法的非遞迴c實現 include include typedef struct binode binode,bitree typedef...

資料結構 Java實現二叉樹遍歷(遞迴)

遞迴實現遍歷求節點數求數的深度十分簡單,通俗易懂,但是遞迴來遍歷的時候會產生大量的副本,在遍歷一棵節點較多的樹的時候,使用這種方法資源利用率不會很高 package datastructure public class binarytreetest 構建一棵二叉樹 public binarytree...