1. 程式人生 > >C 二叉樹的一些操作

C 二叉樹的一些操作

今天不開森,自行車在樓下被偷了

文章目錄

二叉樹的建立

//先序建立二叉樹
void CreatBinarTreeNode(BiThrTree *T){
    char c;
    scanf("%c", &c);
    //輸出空格就是沒有了
    if ( ' ' == c )
{ *T = NULL; }else { *T = (BiThrNode *)malloc(sizeof(BiThrNode)); (*T)->data = c; //建立完跟節點建立下面左右子樹 CreatBinarTreeNode(&(*T)->LeftTreeNode); CreatBinarTreeNode(&(*T)->RightTreeNode); } }

二叉樹的先序遍歷

//先序遍歷,完全是按照遞迴的方式來走,很C
void putout1
(BiThrTree T){ if(T) { printf("%c ", T->data); putout1(T->LeftTreeNode); putout1(T->RightTreeNode); } }

二叉樹的中序遍歷

//中序遍歷
void putout2(BiThrTree T){
    if(T)
    {
        putout2(T->LeftTreeNode);
        printf("%c ", T->data);
        putout2(T->
RightTreeNode); } }

二叉樹的後序遍歷

//後序遍歷
void putout3(BiThrTree T){
    if(T)
    {
        putout3(T->LeftTreeNode);
        putout3(T->RightTreeNode);
        printf("%c ", T->data);
    }
}

看看有多少個葉子節點(度為0的節點)

//葉子節點
int Leafnum(BiThrTree T){
	//節點啥也沒有就返回0
    if(!T)
        return 0;
    //葉子節點就是最下面的,就是左右節點均無的
    else if (!T->LeftTreeNode && !T->RightTreeNode)
        return 1;
    //按照遞迴來找就可以了
    else
        return Leafnum(T->LeftTreeNode) + Leafnum(T->RightTreeNode);
    return -1;
}

總共有多少個節點

//總節點
int nodeNum(BiThrTree T){
    if(!T)
        return 0;
    //只要走過有東西那就加1
    else
        return 1 + nodeNum(T->LeftTreeNode)+nodeNum(T->RightTreeNode);
    return -1;
}

二叉樹的高度

//二叉樹的高度
int heightBitree(BiThrTree T){
	//空節點肯定是0
    if(!T)
        return 0;
    //因為二叉樹的高度就是左右樹那個最長的那個
    //所以逆向來的話就是比較子節點的高度,哪個高要哪個
    else
    {
    	int Lheight = heightBitree(T->LeftTreeNode);
    	int Rheight = heightBitree(T->RightTreeNode);
    	return Lheight > Rheight ? Lheight+1 : Rheight+1;
    }
        
    return -1;
}

度為1的節點個數

//度為1的節點個數
int nodeOnenume(BiThrTree T){
    if(!T)
        return 0;
    //只要符合條件就加一,並且看看下面還有木有
    else if((T->LeftTreeNode && !T->RightTreeNode) || (!T->LeftTreeNode && T->RightTreeNode))
        return 1 + nodeOnenume(T->LeftTreeNode) + nodeOnenume(T->RightTreeNode);
    //繼續遞迴
    else
        return nodeOnenume(T->LeftTreeNode) + nodeOnenume(T->RightTreeNode);
    return 0;
}

度為2的節點個數

//度為2的節點個數
int nodeTwonume(BiThrTree T){
    if(!T)
        return 0;
    //符合條件接著往下找
    else if(T->LeftTreeNode && T->RightTreeNode)
        return 1 + nodeTwonume(T->LeftTreeNode) + nodeTwonume(T->RightTreeNode);
    //度為1的結點的話,就看看它的子節點裡有木有
    else
    	return nodeOnenume(T->LeftTreeNode) + nodeOnenume(T->RightTreeNode);
    return -1;
}

交換左右子樹

//交換左右子樹
void exchangeTree(BiThrTree *T){
    if(*T){
    	//這裡就將兩個大的子樹就換了
        BiThrTree temp = (*T)->LeftTreeNode;
        (*T)->LeftTreeNode = (*T)->RightTreeNode;
        (*T)->RightTreeNode = temp;
        //還是遞迴,子樹的規模會縮小,也會越細節
        exchangeTree(&(*T)->LeftTreeNode);
        exchangeTree(&(*T)->RightTreeNode);
    }
}

完整程式碼

//
//  main.c
//  二叉樹的若干操作
//
//  Created by 赫凱 on 2018/10/26.
//  Copyright © 2018 赫凱. All rights reserved.
//
#include <stdlib.h>
#include <stdio.h>

typedef int ElementType;

typedef struct BinaryTreeNode{
    ElementType data;
    struct BinaryTreeNode *LeftTreeNode;
    struct BinaryTreeNode *RightTreeNode;
}BiThrNode, *BiThrTree;

//先序建立二叉樹
void CreatBinarTreeNode(BiThrTree *T){
    char c;
    scanf("%c", &c);
    
    if ( ' ' == c ){
        *T = NULL;
    }else {
        *T = (BiThrNode *)malloc(sizeof(BiThrNode));
        (*T)->data = c;
        
        CreatBinarTreeNode(&(*T)->LeftTreeNode);
        CreatBinarTreeNode(&(*T)->RightTreeNode);
    }
}

//先序遍歷
void putout1(BiThrTree T){
    if(T)
    {
        printf("%c ", T->data);
        putout1(T->LeftTreeNode);
        putout1(T->RightTreeNode);
    }
}

//中序遍歷
void putout2(BiThrTree T){
    if(T)
    {
        putout2(T->LeftTreeNode);
        printf("%c ", T->data);
        putout2(T->RightTreeNode);
    }
}
//後序遍歷
void putout3(BiThrTree T){
    if(T)
    {
        putout3(T->LeftTreeNode);
        putout3(T->RightTreeNode);
        printf("%c ", T->data);
    }
}

void putout(BiThrTree T){
    printf("\n先序:");
    putout1(T);
    printf("\n中序:");
    putout2(T);
    printf("\n後序:");
    putout3(T);
}
//葉子節點
int Leafnum(BiThrTree T){
    if(!T)
        return 0;
    else if (!T->LeftTreeNode && !T->RightTreeNode)
        return 1;
    else
        return Leafnum(T->LeftTreeNode)+Leafnum(T->RightTreeNode);
    return -1;
}
//總節點
int nodeNum(BiThrTree T){
    if(!T)
        return 0;
    else
        return 1+nodeNum(T->LeftTreeNode)+nodeNum(T->RightTreeNode);
    return -1;
}
//二叉樹的高度
int heightBitree(BiThrTree T){
    if(!T)
        return 0;
    else
        return heightBitree(T->LeftTreeNode)>heightBitree(T->RightTreeNode)?heightBitree(T->LeftTreeNode)+1:heightBitree(T->RightTreeNode)+1;
    return -1;
}
//度為1的節點個數
int nodeOnenume(BiThrTree T){
    if(!T)
        return 0;
    else if((T->LeftTreeNode && !T->RightTreeNode) || (!T->LeftTreeNode && T->RightTreeNode))
        return 1 + nodeOnenume(T->LeftTreeNode) + nodeOnenume(T->RightTreeNode);
    else
        return nodeOnenume(T->LeftTreeNode) + nodeOnenume(T->RightTreeNode);
    return 0;
}

//度為2的節點個數
int nodeTwonume(BiThrTree T){
    if(!T)
        return 0;
    else if(T->LeftTreeNode && T->RightTreeNode)
        return 1+nodeTwonume(T->LeftTreeNode) + nodeTwonume(T->RightTreeNode);
    else
        return nodeTwonume(T->LeftTreeNode) + nodeTwonume(T->RightTreeNode);
    return 0;
}
//交換左右子樹
void exchangeTree(BiThrTree *T){
    if(*T){
        BiThrTree temp = (*T)->LeftTreeNode;
        (*T)->LeftTreeNode = (*T)->RightTreeNode;
        (*T)->RightTreeNode = temp;
        
        exchangeTree(&(*T)->LeftTreeNode);
        exchangeTree(&(*T)->RightTreeNode);
    }
}

int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    //abc  d  ef  g  
    BiThrTree Tree = NULL;
    CreatBinarTreeNode(&Tree);
    putout(Tree);
    
    printf("\n");
    printf("葉子點的個數%d",Leafnum(Tree));
    
    printf("\n");
    printf("節點的個數%d",nodeNum(Tree));
    
    printf("\n");
    printf("高度%d",heightBitree(Tree));
    
    printf("\n");
    printf("度為1的個數:%d",nodeOnenume(Tree));
    
    printf("\n");
    printf("度為2的個數:%d",nodeTwonume(Tree));
    
    exchangeTree(&Tree);
    putout(Tree);
    return 0;
}