一、统计二叉树度为1的结点个数
问题描述
计算二叉树中度为1的结点个数。
输入描述
按照先序遍历序列输入一行字符串,以大写字母和#分别表示结点和虚结点。
输出描述
输出对应二叉树的度为1的结点个数。
样例输入
AB#DE##F##C##
样例输出
1
#include<stdio.h>
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree&T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T=new BiNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
int NodeCount(BiTree T){
if(T==NULL)
return 0;
int m = NodeCount(T->lchild);//左子树上度为1的结点数
int n = NodeCount(T->rchild);//右子树上度为1的结点数
int k=0;
if((T->lchild==NULL&&T->rchild!=NULL)|| (T->lchild!=NULL&&T->rchild==NULL))
k=1;
return m+n+k;
}
int main(){
BiTree T;
CreateBiTree(T);
printf("%d",NodeCount(T));
return 0;
}
二、二叉树的高度
问题描述
编写递归函数,求一棵二叉树的高度。
输入描述
按照先序遍历次序输入一行字符串,以大写英文字母和#分别表示结点和虚结点。
输出描述
输出相应二叉树的高度。
样例输入
AB##CDE##F###
样例输出
4
#include<stdio.h>
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree&T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T=new BiNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
int HighTree(BiTree T)
{
if(T==NULL)
return 0;
else
{
int left_depth=HighTree(T->lchild);
int right_depth=HighTree(T->rchild);
return (left_depth>right_depth?left_depth:right_depth)+1;
}
}
int main()
{
BiTree T;
CreateBiTree(T);
printf("%d",HighTree(T));
return 0;
}
三、交换二叉树中每个结点的左孩子和右孩子
问题描述
以二叉链表作为二叉树的存储结构,交换二叉树中每个结点的左孩子和右孩子,
输入描述
按照先序遍历次序输入一行字符串,以大写英文字母和#分别表示结点和虚结点。
输出描述
先输出原来的二叉树的中序遍历结果,再输出交换后二叉树的中序遍历结果。
样例输入
ABC##DE#G##F###
样例输出
交换前的中序遍历结果为:C B E G D F A 交换后的中序遍历结果为:A F D G E B C
#include<stdio.h>
typedef struct BiNode{
char data;
struct BiNode *lchild,*rchild;
}BiNode,*BiTree;
void CreateBiTree(BiTree&T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
T=NULL;
else
{
T=new BiNode;
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
}
void SwapTree(BiTree &T)
{
if(T==NULL)
return;
BiNode* temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
SwapTree(T->lchild);
SwapTree(T->rchild);
}
void PrintTree(BiTree T)
{
if(T!=NULL)
{
PrintTree(T->lchild);
printf("%c ",T->data);
PrintTree(T->rchild);
}
}
int main()
{
BiTree T;
CreateBiTree(T);
printf("交换前的中序遍历结果为:");
PrintTree(T);
printf("\n");
SwapTree(T);
printf("交换后的中序遍历结果为:");
PrintTree(T);
return 0;
}