对于二叉树,最重要的操作是遍历,在之前介绍的遍历的基础上,关于二叉树可以延伸出各种对于二叉树的其他操作,下面就为大家介绍
1.输出二叉树的叶子结点
只需要在之前前序遍历的基础上增加检测结点的“左右子树是否都为空”。
//输出二叉树的叶子结点
void PreOderPrintLeaves(Ptree BT){
if(BT)
{ if(!BT->lchild&&!BT->rchild)//检测结点的“左右子树是否都为空”
printf("%c",BT->data);
preOrder(BT->lchild);
preOrder(BT->rchild);
}
};
2.求二叉树的高度
利用了后序遍历的代码,具体实现代码如下
//求二叉树的高度
int PostOrderGetHeight(Ptree BT){
int HL,HR,MaxH;
if(BT){
HL= PostOrderGetHeight(BT->lchild);
HR= PostOrderGetHeight(BT->rchild);
MaxH=(HL>HR)?HL:HR;
return (MaxH+1);
}
else return 0;
};
暂时先按照这两个搞,举个例子,还是上面博客中的例子
A
B C
D F G I
E H
执行结果如下图
完整的程序代码如下
#include "stdio.h"
#include "stdlib.h"
typedef struct tree
{
char data;
struct tree *lchild;
struct tree *rchild;
}*Ptree;
//树的建立
Ptree createTree();
//先序遍历
void preOrder(Ptree t);
//中序遍历
void intOrder(Ptree t);
//后序遍历
void postOrder(Ptree t);
//输出二叉树的叶子结点
void PreOderPrintLeaves(Ptree BT);
//求二叉树的高度
int PostOrderGetHeight(Ptree BT);
void main()
{
Ptree t;
printf("先序创建二叉树,用空格代表虚结点:\n");
t=createTree();
printf("前序遍历:");
preOrder(t) ;
printf("\n");
printf("中序遍历:");
intOrder(t);
printf("\n");
printf("后序遍历:");
postOrder(t);
printf("\n");
printf("输出二叉树的叶子结点:");
PreOderPrintLeaves(t);
printf("\n");
printf("求二叉树的高度:");
printf("%d",PostOrderGetHeight(t));
printf("\n");
system("pause");
}
Ptree createTree() //树的建立
{
char ch;
Ptree t;
ch=getchar(); //输入二叉树数据
if(ch==' ') //判断二叉树是否为空
t=NULL;
else
{
t=(Ptree)malloc(sizeof(Ptree)); //二叉树的生成
t->data=ch;
t->lchild=createTree();
t->rchild=createTree();
}
return t;
}
void preOrder(Ptree t) //先序遍历
{
if(t)
{
printf("%c",t->data);
preOrder(t->lchild);
preOrder(t->rchild);
}
}
void intOrder(Ptree t) //中序遍历
{
if(t)
{
intOrder(t->lchild);
printf("%c",t->data);
intOrder(t->rchild);
}
}
void postOrder(Ptree t) //后序遍历
{
if(t)
{
postOrder(t->lchild);
postOrder(t->rchild);
printf("%c",t->data);
}
}
//输出二叉树的叶子结点
void PreOderPrintLeaves(Ptree BT){
if(BT)
{ if(!BT->lchild&&!BT->rchild)//检测结点的“左右子树是否都为空”
{printf("%c",BT->data);}
PreOderPrintLeaves(BT->lchild);
PreOderPrintLeaves(BT->rchild);
}
};
//求二叉树的高度
int PostOrderGetHeight(Ptree BT){
int HL,HR,MaxH;
if(BT){
HL= PostOrderGetHeight(BT->lchild);
HR= PostOrderGetHeight(BT->rchild);
MaxH=(HL>HR)?HL:HR;
return (MaxH+1);
}
else return 0;
};
还有一些操作我今后有时间的时候会慢慢放上来的,比如说
输入二叉树中的两个节点,输出这两个结点在树中最低的共同父节点。
思路:遍历二叉树,找到一条从根节点开始到目的节点的路径,然后在两条路径上查找共同的父节点。