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