c語言實現二叉樹的遍歷和建立程式(附帶註釋)
//樹的遞迴思想,把每個節點當作是一棵樹,以後序遍歷為例
//步驟1:訪問左子樹.2訪問右子樹3.列印當前節點的值
//在節點遍歷時如果某節點沒有左節點或者是右節點是傳遞的指標是NULL
//說明下一步沒有樹了可以返回
/******************************************************************/
typedef char data_node;
typedef struct NODE
{
struct NODE *l_node,*r_node;
data_node value;
} node;
/******************************************************************/
//function:preordertraverse a bitree and printf the value in every node
//argument:pointer to the frist node of this bitree
/******************************************************************/
int preordertraversal(node *pointer)
{
if(NULL == pointer) //is a new bitree? if not, return.
return 0;
else
{
//print it's value before ,print it's child tree
printf("%c ",pointer->value); //print value of this node
preordertraversal(pointer->l_node); //enter left tree
preordertraversal(pointer->r_node); //enter right tree
}
return 0;
}
/******************************************************************/
//function:inordertraverse a bitree and printf the value in every node
//argument:pointer to the frist node of this bitree
/******************************************************************/
int inordertraversal(node *pointer)
{
if(NULL == pointer)
return 0;
else
{
inordertraversal(pointer->l_node); //enter left tree
//In this time ,left childtree blong this node was traversed,and we can print it's value
printf("%c ",pointer->value); //print value of this node
inordertraversal(pointer->r_node); //enter right tree
}
return 0;
}
/******************************************************************/
//function:postordertraverse a bitree and printf the value in every node
//argument:pointer to the frist node of this bitree
/******************************************************************/
int postordertraversal(node *pointer)
{
if(NULL == pointer)
return 0;
else
{
postordertraversal(pointer->l_node); //enter left tree
postordertraversal(pointer->r_node); //enter right tree
//In this time , two childtree blong this node was traversed,and we can print it's value
printf("%c ",pointer->value); //print value of this node
}
return 0;
}
/******************************************************************/
//function:creat a new bitree
//argument:pointer to a char array contain many node and these nodes according to the preorder traversal is saved.
/******************************************************************/
//假設我們用二叉樹前序遍歷的思維,遍歷結果儲存在陣列中,將printf列印改成malloc建立節點即可 ,
//注意:在遍歷過程中如果當前節點沒有左子樹或者是右子樹就用×代替,以達到給遞迴創造返回條件的效果
node *creat_bitree(char a[]){
static int i=0; //靜態儲存防止遞迴呼叫時丟失上一次呼叫後i所指的a陣列的位置
node *pointer;
data_node value;
if('*' == (value = a[i++]))
return NULL;
else
{
pointer = (node *)malloc(sizeof(node)); //建立該節點
pointer->value = value; //先為該節點賦值
pointer->l_node = creat_bitree(a); //建立該節點的左子樹
pointer->r_node = creat_bitree(a); //建立該節點的右子樹
}
//In this time,new bitree tree was be created and now return the point to this bitree to user. or last node
return pointer;
}