C 二叉樹的一些操作
阿新 • • 發佈:2018-11-01
今天不開森,自行車在樓下被偷了
文章目錄
二叉樹的建立
//先序建立二叉樹
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;
}