二叉樹的性質以及二叉樹的遍歷(非遞歸)(c語言)(一)

二叉樹的性質:node

性質 1 在二叉樹的第i層上至多有2^(i-1)個結點(i>=1)。數據結構

性質 2 深度爲k的二叉樹至多有2^k-1個結點,(k>=1)。函數

性質 3 任何一顆二叉樹,終端結點爲n0,度爲2的結點爲n2,那麼n0=n2+1。post

性質 4  具備n個結點的徹底二叉樹的深度爲└㏒2 n┘+1。學習

性質 5 徹底二叉樹按層次從上到下從左到右依次編號。編號爲n的節點的左孩子爲2n。測試

二叉樹的儲存結構.net

lchild data rchild
/*---------二叉樹的二叉鏈表儲存表示----------*/
typedef struct BiTNode{
    ElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode ,*BiTree;

非遞歸遍歷須要棧:棧的實現過程:棧的線性儲存結構與鏈式儲存結構的實現(C語言)指針

棧部分的內容:code

typedef BiTree pElemType;
typedef struct Snode //棧的儲存結構 
{
    pElemType data;	//數據域 

    struct Snode *next; //指針域 
}Snode,*LinkStack;
void Init_StackL(LinkStack *S)	//初始化院棧 
{
    *S=NULL;
}
Status Push_L(LinkStack *S,pElemType x) 	//壓棧 
{
    LinkStack p;
    p=(LinkStack)malloc(sizeof(Snode)); 
    p->data=x;

    p->next=*S;

    *S=p;
    return 1;
}
Status Pop_L(LinkStack *S,pElemType *temp_) //出棧 
{
    LinkStack p;
    pElemType temp;
    if(*S==NULL) return 0;

    temp=(*S)->data;

    p=*S;

    *S=p->next;
    free(p);

    *temp_=temp;
    return 1;
}
Status StackEmpty(LinkStack *S) 	//判斷棧頂是否爲空 若是爲空返回 0 
{
    if(*S==NULL) return 0;

    else
        return 1;
}

如下爲二叉樹部分:blog

Status CreateBiTree(BiTNode **T)	//先序生成二叉樹 
{
    int ch;

    scanf("%d",&ch);
    if(ch==0) *T=NULL;
    else{
        if(!(*T=(BiTNode *)malloc(sizeof(BiTNode))))exit(0);
        (*T)->data=ch;
        CreateBiTree(&(*T)->lchild);
    
        CreateBiTree(&(*T)->rchild);
    }
    return 1;
}
}
Status preOrderTraverse(BiTNode *T)//前序遍歷二叉樹,並統計總結點 
{
	int i=0;
    LinkStack S;
    BiTNode *p;
    p=T;
    Init_StackL(&S);
    while(p||StackEmpty(&S)){//StackEmpty(&S)判斷棧頂是否爲空 若是爲空返回 0 
        if(p){
            Push_L(&S,p);
      		     printf("%d\t",p->data);
      		     i++;
            p=p->lchild; 

        }
        else{
            Pop_L(&S,&p);
 
            if(!(p->data)) return 0;
       
            p=p->rchild;
        }
    }
  //  return 1;
	printf("\n全部生成節點的總數爲:%d\n",i);//總結點	
} 
Status InOrderTraverse(BiTNode *T)	//中序遍歷二叉樹 
{

    LinkStack S;
    BiTNode *p;
    p=T;
    Init_StackL(&S);
    while(p||StackEmpty(&S)){//StackEmpty(&S)判斷棧頂是否爲空 若是爲空返回 0 
        if(p){
            Push_L(&S,p);
      
            p=p->lchild; 

        }
        else{
            Pop_L(&S,&p);
 
            if(!(p->data)) return 0;
            printf("%d\t",p->data);
            p=p->rchild;
        }
    }
    return 1;
}
void postorder(BiTNode *T)//用遞歸的方法後續遍歷二叉樹 
{
	if(T!=NULL)
	{
		postorder(T->lchild);
		postorder(T->rchild);
		printf("%d\t",T->data);
	}
}

如下爲測試函數,先序生成二叉樹:若是爲結點空則輸入 0。

咱們輸入的數據爲:1 2 4 0 0 5 0 0 3 0 0 ;

void main()
{
    BiTNode *T;
        printf("請按以下圖案先序生成鏈表,0表明爲空:\n");
	printf("        ①\n");
	printf("      ╱   ╲\n");
	printf("    ②       ③ \n");
	printf("  ╱   ╲\n");
	printf("④       ⑤ \n");
	printf("輸入的數字是1 2 4 0 0 5 0 0 3 0 0 "); 
    CreateBiTree(&T);
   	printf("        ①\n");
	printf("      ╱   ╲\n");
	printf("    ②       ③ \n");
	printf("  ╱   ╲\n");
	printf("④       ⑤ \n");
   	printf("中序遍歷二叉樹的結果爲:");
    InOrderTraverse(T);
	printf("\n後續遍歷二叉樹的結果爲:");
    postorder(T);//用遞歸的方法後續遍歷二叉樹 
   	printf("\n前序遍歷二叉樹的結果爲: ");
   	preOrderTraverse(T);
   	printf("\n");
}

程序運行的結果爲:

正在加載圖片


學習數據結構記錄,若有錯誤歡迎指正。

參考書:數據結構 c語言版

相關文章
相關標籤/搜索