1. 程式人生 > >基本資料結構——二叉樹的建立,遍歷,求葉子節點,深度計算

基本資料結構——二叉樹的建立,遍歷,求葉子節點,深度計算

/*
新建立一棵二叉樹,遍歷,查詢樹的高度,查詢樹的葉子節點,和總結點數  然後再計算距離最遠的兩個節點。
SQ 2014-04-20
*/
#include<stdio.h>
struct Node{
    int data;
    struct Node * left;
    struct Node * right;
};
typedef struct Node Node;

typedef struct Node * tree;

//一 ,新建立一棵樹
void creat( tree *p){
    int data;
    scanf("%d",&data);
    if(data == 0){
        *p=NULL;
        return ;
        }
        else {
            *p=(tree)malloc(sizeof(Node));
            (*p)->data = data;
            creat(&((*p)->left));
            creat(&((*p)->right));
        }        
}

//二 遍歷整棵樹,這裡採用的是先序遍歷

void show(tree root){
        
    if(root == NULL)
        return ;
    else {
        show(root->left);
        printf("%d--->",root->data);
        show(root->right);
    }
}
//三,查詢樹的葉子節點(很明顯,左右孩子都為空的就是葉子節點)
void find_leaf( tree root){

    if(root  == NULL)
        return ;

    else {
        find_leaf(root->left);
        if(root->left == NULL && root->right == NULL)
            printf("葉子節點是:%d\n",root->data);
        find_leaf(root->right);        
    }
}

//, 查詢樹的總節點數:是左子樹的節點總數 + 1 + 右子樹的總節點數

    int  total(tree root){
    
        if(root == NULL)
            return ;
        else return (total(root->left) + 1 + total(root->right));
}



//查詢樹的高度 :樹的深度就是其左、右子樹深度的較大值再加1
int max(int a, int b){

    if (a > b ) return a;
    else return b;
}
    
int  high(tree root){
    
    // 沒有左子樹  ,就算右子樹深度 +1
    // 沒有右子樹  ,就算左子樹深度 +1
    // 左右都沒有  , 就算 1
    //最後都不為空的話,那麼就取較大值 +1
    
    if ( (root->left == NULL) && (root ->right != NULL)  )
        return high(root->right) +1;

    else if((root->left != NULL) &&( root->right == NULL))
        return high(root->left) +1;

    else if((root->left == NULL) && (root->right== NULL))
        return 1;
    
    else return(max(high(root->left) , high(root->right) )  +1);
}


/*計算距離最遠的兩個節點:1.可能都在根節點的左子樹上,2.也可能都在右子樹上,3.還有可能是根節點和深度最大的節點。
解法一,1.求出二叉樹的所有葉子節點。2.求任意兩個葉子節點的第一個祖先節點。3.計算具有祖先-子孫關係的兩個節點之間的路徑之和。
 ... 待續...

*/

int main(){

    tree root;
    creat(&root); //這裡需要更改root,之前的root沒有指向,所以要傳遞&(root)。
    show(root);
    printf("\n");
    find_leaf(root);
    int sum;
    sum =total(root);
    printf("總節點數是:%d\n" ,sum);
    int depth;
    depth = high(root);
    printf("樹的深度是:%d\n" ,depth);
    
    return 0;
}